答案 1(将以不同的方式涵盖 2):使用“部署”选项卡下的 Artifactory“Artifact Bundle”功能部分可以为 AT 做 TRICK至少以我们想要的方式上传工件,首先创建一个 zip 文件(包含其中的结构和工件)--或者您可以使用/调用 Artifactory REST API 方式。
高层次的想法:
创建一个名为 gigaproject.zip 的 zip 文件或 Artifactory 可以读取的 anyname.zip/.tar/compressed 文件。在 zip 中,创建结构 - 这些工件将如何加载到 Artifactory
即
gigaproject.zip 将包含以下文件夹/结构/文件。
案例 1:
com/company/project/gigaproject/9.8.0/linux/gigainstall
com/company/project/gigaproject/9.8.0/solaris/gigainstall
com/company/project/gigaproject/9.8.0/win32/gigainstall.exe
com/company/project/gigaproject/9.8.0/gigafile.dtd
com/company/project/gigaproject/9.8.0/gigaanotherfile.dtd
com/company/project/gigaproject/9.8.0/giga.jar
com/company/project/gigaproject/9.8.0/giga.war
注意:在案例 1 示例中,我没有在文件名中使用任何 -xxx(即我使用的是简单明了的 giga.jar 而不是 giga-9.8.0.jar) .
上面的 Upload/Deploy 会生成文件(如下图所示):
所以,我们已经实现了我们想要的。实际上(显然是这样),但 Artifactory 通常不会以某种方式存储这些工件(因为它们应该 -x.x.x 版本嵌入在文件名中,并且工件 id 应该与工件文件名匹配)。现在,如果您想在 Gradle 构建文件中使用以下内容,首先您不能上传带有 -xxx 版本名称的文件名,其次,我们案例 1 树中的工件 id 是“gigaproject”(在 com/company/project 文件夹之后),因此 Gradle 定义您想要的工件 id 和工件文件名的方式将不起作用。
compile 'com.company.project:gigaproject:CANNOTSAY_HOW_TO_GET_GIGA_JARorGIGAINSTALL_with_without_extension'
结论:可以上传任何结构中的任何文件(在 Artifactory 中带/不带扩展名),但这取决于您的构建系统将如何使用它或是否能够使用它。
- 我从 Artifactory 存储库中删除了我刚刚使用案例 1 .zip 文件创建的结构以尝试下一个案例#2,并删除了我创建的 .zip 文件。
案例 2:
让我们为每个工件创建一个单独的版本化文件名,并以格式创建结构 - Artifactory 如何实际存储它们(在树视图中的存储库中看到的工件)并创建一个包含该结构的 .zip 文件。让我们使用相同的“Artifact Bundle”功能来上传这个 .zip 文件,以上传我们在 Artifactory 中需要的单个工件 - 其中 artifact-id(我们在尝试使用它时提到的第二个值)将匹配 Artifactory 中的工件文件名称。
.zip 文件的文件夹/文件结构:
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.linux
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.solaris
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.exe
com/company/project/gigafile/9.8.0/gigafile-9.8.0.dtd
com/company/project/gigaanotherfile/9.8.0/gigaanotherfile-9.8.0.dtd
com/company/project/giga/9.8.0/giga-9.8.0.jar
com/company/project/giga/9.8.0/giga-9.8.0.war
注意:这一次,我们将使用相同的“Artifact Bundle”功能和类似的文件(Linux/Solaris 文件夹下的 gigainstall),我采用创建 gigainstall 文件夹的方法(包含 gigainstall-9.8.0.linux 和 gigainstall-9.8.0.solaris 文件名)即当我们将在 Gradle 中的依赖项 { ... } 部分下使用这些工件进行编译时,我们将使用 xxx@ 方式来获取这些来自 Artifactory 的文物。
好的,一旦“Artifact Bundle”部署/上传成功完成,我收到以下消息。
从存档中成功部署 7 个工件:gigaproject.zip(1 秒)。
现在,让我们看看它在 Artifactory 中的样子,同时在树视图中搜索工件之一。您可以看到我们现在已经有了文件,使用 filename-x.x.x.extension 方式,以便我可以在 Gradle 中轻松使用它们。
在 Gradle 构建文件 (build.gradle) 中,我会提到:
依赖{
编译“com.company.project:gigainstall:9.8.0@linux”
编译“com.company.project:gigainstall:9.8.0@solaris”
编译“com.company.project:gigainstall:9.8.0@linux”
编译“com.company.project:giga:9.8.0
编译“com.company.project:giga:9.8.0@war
编译“com.company.project:gigafile:9.8.0@dtd
编译“com.company.project:gigaanotherfile:9.8.0@dtd
}
OH OH!! - 这不起作用,请参阅下面的 Gradle 错误。为什么? - Artifactory Bundle 上传/部署功能会上传 .zip 中的 zip 文件内容,但它不会为每个部署的工件创建 .pom 文件。因此,使 Gradle 构建失败。可能在 Ant 中这可能会成功。这发生在每个单独的 .jar/.war/.dtd/etc 文件中。我只是展示一个错误示例。
在进行 gradle clean build
Could not resolve all dependencies for configuration ':compile'.
> Could not resolve com.company.project:gigafile:0.0.0.
Required by:
com.company.project:ABCProjectWhichConsumesGIGAProjectArtifacts:1.64.0
> Could not GET 'http://artifactoryserver:8081/artifactory/ext-snapshot-local/com/company/project/gigafile/0.0.0/gigafile-0.0.0.pom'. Received status code 409 from server: Conflict
案例 3:让我们采取一种简单的方法(解决方法,但会省去很多麻烦)。
创建具有以下结构的 gigaproject.zip 文件,此方法采用 - 文件夹/文件结构中的单个工件/文件名中没有嵌入 x.x.x 版本值。我们将使用“Single Artifact”方法(它将在 Artifactory 提供的上传/部署过程中自动为 gigaproject.zip 文件创建 .pom)。您仍然可以使用这种方法获得 gigainstall 文件,而无需对其名称进行任何扩展。如您所见,在上传/部署步骤中,您上传 gigaproject.zip,artifactory 会将其作为“gigaproject-xxx.zip”上传到给定的目标存储库,其中 xxx在我们的例子中,em> 是 9.8.0。请参阅下面的图像快照。
gigaproject/linux/gigainstall
gigaproject/solaris/gigainstall
gigaproject/win32/gigainstall.exe
gigaproject/gigafile.dtd
gigaproject/gigaanotherfile.dtd
gigaproject/gigaproject.zip
gigaproject/giga.jar
gigaproject/giga.war
现在,使用“单个工件”功能将其上传到 Artifactory。调整 GroupId、ArtifactId、Version 等的值后,单击“Deploy Artifact”。
上传后。您将在目标存储库中的 zip 工件中看到(我举了一个不好的例子,通常这将是 libs-snapshot-local 或 libs-release-local 而不是 ext-...),您将能够使用直接在 Gradle 中的 ZIP 工件:
dependencies {
// This is the only line we need now.
compile "com.company.project:gigaproject:9.8.0@zip"
}
一旦 .zip 可用于 Gradle 构建系统,现在您可以告诉 Gradle 在您的构建/工作区的某个位置解压缩此 .zip 文件,您可以在其中提供实际(解压缩的)文件(gigainstall、.dtd、.jar , .war 等)到构建过程/步骤。
PS:我猜第 1 和第 2 种情况可能适用于 Ant。
答案 2:
如果您以任何一种方式上传了非扩展文件。确保您也手动创建/上传了它的 POM 文件(即,如果我将 gigainstall-9.8.0 作为工件上传到 com/company/project/gigainstall/9.8.0/gigainstall-9.8.0,然后在同一级别,我必须/应该创建它的 POM 文件(参见自定义 jar 工件的简单模板 .pom 文件或通过“单个工件”部署上传扩展文件时,您会看到 POM 编辑器 窗口显示给你)并上传两者,这样 Gradle 就不会出错,说没有 POM 冲突/错误。Ant 可能不需要 pom(我没有检查)。
一旦它在 Artifactory 中,以下行应该可以工作 - 或者如果您找到其他方法,请发表评论。
dependencies {
// See nothing mentioned after - x.x.x@
compile "com.company.package:gigainstall:9.8.0@"
}