答案 1(在不同的意义上也将涵盖 2):使用“部署”选项卡下的 Artifactory“Artifact Bundle”功能部分可以通过首先创建一个 zip 文件来执行至少以我们想要的方式上传工件的技巧(包含其中的结构和工件)--或者您可以使用/调用Artifactory REST API方式上传工件。
高层次的想法:
创建 Artifactory 可以读取的名为 gigaproject.zip 或 anyname.zip/.tar/compressed 文件的 zip 文件。在 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 通常不会以某种方式存储这些工件(因为它们应该 -xxx 版本嵌入在文件名中,并且工件 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 文件。
案例二:
让我们为每个工件创建一个单独的版本化文件名,并以格式创建结构 - 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 中的样子,同时在 Tree 视图中搜索工件之一。你可以看到我们现在已经有了文件,使用 filename-xxxextension 方式,以便我可以在 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
}
哦哦!!- 这不起作用,请参阅下面的 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 文件,此方法采用 - 文件夹/文件结构中的单个工件/文件名中没有嵌入 xxx 版本值。我们将使用“Single Artifact”方法(它将在 Artifactory 提供的上传/部署过程中自动为 gigaproject.zip 文件创建 .pom)。您仍然可以使用这种方法获得 gigainstall 文件,而无需对其名称进行任何扩展。如您所见,在上传/部署步骤中,您上传 gigaproject.zip,artifactory 会将其作为“ gigaproject-xxx.zip ”上传到给定的目标存储库,其中xxx为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
现在,使用“Single Artifact”功能将其上传到 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 文件,或者在通过“Single Artifact”部署上传扩展文件时,您将看到POM 编辑器窗口显示的内容)并上传两者这样 Gradle 就不会出错说没有 POM 冲突/错误。Ant 可能不需要 pom(我没有检查)。
一旦它在 Artifactory 中,以下行应该可以工作——或者如果你找到另一种方法,请发表评论。
dependencies {
// See nothing mentioned after - x.x.x@
compile "com.company.package:gigainstall:9.8.0@"
}