【问题标题】:Uploading artifacts and downloading dependencies with Gradle or Maven from Nexus Repository使用 Gradle 或 Maven 从 Nexus Repository 上传工件和下载依赖项
【发布时间】:2026-01-18 02:55:02
【问题描述】:

自从我设法设置 Nexus OSS、Maven 和 Gradle 以实现以下目标已经过去了 2 周:

  1. 将文件上传到将它们链接在一起的公司 Nexus 存储库。因此,文件必须保留一个链接才能定义由其 groupId/artifactId/version 填充的“包”。

  2. 下载通过某种东西(如 POM 依赖模式)链接在一起的“包”(文件集)。

目前,我可以使用 Maven 和 Gradle 在 Nexus 上上传一个文件。即使我在 POM 文件或使用 Gradle 的 build.gradle 中指定了依赖项,我也无法一次下载该文件及其所有依赖项。

这里的目标只是能够定义一组按组/名称/版本排序的组件,并且能够一次将它们全部下载到一个包中。这就像版本打包管理。

我已经看了 2 周,但无法使用 Maven 或 Gradle 来实现这些目标。 请谁能告诉我如何使用 Maven 或 Gradle 来完成这项工作?

这是我在 Maven 中用于链接 artifactA 和 artifactB 的 POM 文件:

ArtifactA POM 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>groupA</groupId>
   <artifactId>artifactA</artifactId>
   <version>1.2.4</version>
   <packaging>jar</packaging>

   <dependencyManagement>
      <dependencies>
      </dependencies>
   </dependencyManagement>

   <distributionManagement>
      <repository>
         <id>nexus</id>
         <name>Nexus Test Repository</name>
         <url>http://localhost:7080/repository/content/repositories/releases/</url>
      </repository>
   </distributionManagement>

</project>

ArtifactB POM 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>groupA</groupId>
   <artifactId>artifactB</artifactId>
   <version>1.0.0</version>
   <packaging>jar</packaging>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>groupA</groupId>
            <artifactId>artifactA</artifactId>
            <version>1.2.4</version>
            <type>jar</type>
         </dependency>
       </dependencies>
    </dependencyManagement>

    <distributionManagement>
       <repository>
          <id>nexus</id>
          <name>Nexus Test Repository</name>
          <url>http://localhost:7080/repository/content/repositories/releases/</url>
       </repository>
    </distributionManagement>
</project>

一旦我使用这些命令上传了 A 然后 B:

mvn deploy:deploy-file \
-Dfile=artifactA_package.jar \
-Dpackaging=jar \
-DpomFile=pomA1.2.4.xml \
-Durl=http://localhost:7080/repository/content/repositories/releases/ \
-DrepositoryId=nexus

mvn deploy:deploy-file \
-Dfile=artifactB_package.jar \
-Dpackaging=jar \
-DpomFile=pomB1.0.0.xml \
-Durl=http://localhost:7080/repository/content/repositories/releases/ \
-DrepositoryId=nexus

当我使用此脚本下载 B 时,即使 artifactB POM 文件指定了对 A 的依赖项,这两个文件也已很好地上传到我的 Nexus 存储库中:

mvn dependency:get \
-Dartifact=groupA:artifactB:1.0.0:jar \
-DremoteRepositories=nexus::default::http://localhost:7080/repository/content/repositories/releases/

Maven 只下载 B,但不下载 A。即使我在 B 上使用此命令:

mvn dependency:resolve

它告诉我“依赖:无”之类的信息。 所以 Nexus 或 Maven 不知道从 B 到 A 的依赖关系。

当我使用这个“build.gradle”文件时,Gradle 也无法实现我的目标:

apply plugin: 'maven'

repositories {
    maven {
        url "http://localhost:7080/repository/content/groups/public/"
    }
}

artifacts {
    archives file('artifactB_package.jar')
}

dependencies {
    archives files('artifactA_package.jar')
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://localhost:7080/repository/content/repositories/releases/") {
            authentication(userName: "deployment", password: "deployment123")
            }

            pom.project {
                groupId "groupA";
                artifactId "artifactB";
                version "1";

                dependencies {
                    dependency {
                        groupId "groupA";
                        artifactId "artifactA";
                        version "1";
                    }
                }
            }
        }
    }
}

它只上传 B。

【问题讨论】:

    标签: maven gradle dependencies repository nexus


    【解决方案1】:

    您正在围绕系统进行某种工作?我不确定你试图达到什么目标。但是,如果您想在一次构建期间一次上传多个工件,则需要创建一个多模块项目。

    在 maven 中有一个约定:一个 pom - 一个 artifact (这更像是一个盗版指南,它不是真的,例如源 jars 和 javadoc jars 可以在同一个版本中 - 所以一个 pom 上传了 3 个文件)。

    你使用的deploy命令主要是告诉maven手动上传artifact。您需要的目标是mvn deploy。这将执行构建阶段并将创建的工件上传到nexus(使用distributionManagement部分中的配置。对于多模块构建,这对每个模块都完成。有一个guide,如果您需要示例,还有几个原型(例如appfuse)。

    我不知道 gradle 是如何处理这个问题的,也不知道他们使用了什么最佳实践。

    【讨论】:

    • 感谢您的回答。我试图实现的是上传一组文件,它们的 POM 定义了它们的相互依赖关系。然后我希望能够只用一个解决依赖关系的命令下载所有这些。我用“mvn deploy”尝试了你的方法,但它不能帮助我在一个命令中下载 A 和 B。即使我的 POM 文件定义了从 B 到 A 的依赖关系,Nexus 或 Maven 似乎也看不到它...
    • 这是我解决对 B 的依赖时得到的结果:image.noelshack.com/fichiers/2014/40/…
    • 我明白了。我认为有两种选择:一种是使用“mvn dependency:copy-dependencies”,它将所有需要的 jar 复制到您的目标文件夹中。另一种选择是在构建过程中使用程序集插件将您需要的所有内容打包成一个 zip 文件并将其放入 nexus:maven.apache.org/plugins/maven-assembly-plugin - 有一些默认程序集可用于执行此操作。
    【解决方案2】:

    Nexus 评估指南中有 Maven、Gradle 等的示例项目。整个文档位于http://books.sonatype.com/nexus-book/reference/eval.html,示例项目位于https://github.com/sonatype/nexus-book-examples

    除此之外,如果您想创建一个将所有依赖项与 Maven 一起添加的项目,您可以在程序集插件中使用,例如在http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

    【讨论】:

      最近更新 更多