【问题标题】:How can I deploy only the pom file to my snapshot repository in Maven?如何仅将 pom 文件部署到 Maven 中的快照存储库?
【发布时间】:2026-01-07 04:50:01
【问题描述】:

当运行 mvn deploy 并且版本是 SNAPSHOT 版本时,我希望能够仅部署 POM 工件(文件)而不部署主要工件(JAR、WAR 等)。

为什么?

我们有几位开发人员从事多个 Maven 项目。我们有一个 Hudson 服务器,每个 Maven 项目和版本都有一个作业(例如 foo-1.2、foo-1.3)。每个作业都会构建项目并将其部署到 Nexus 服务器(成功后)。正在开发的 Maven 项目通过在版本中使用 -SNAPSHOT 后缀进行标记。例如:1.2-SNAPSHOT、1.3-SNAPSHOT。

这是一个示例场景,开发人员的工作如何因这种架构而受损。

假设有两个 Maven 项目:foo-core 和 foo-webapp,都在 1.2-SNAPSHOT 版本。

  • 开发人员 A 正在开发 foo-core,进行了一些更改并对其进行了编译。
  • 开发人员 A 继续工作,但在 foo-webapp 上。
  • 开发人员 B 开始工作并更改 foo-core。它提交他的工作并将其推送到 SCM。
  • Hudson 由 SCM 触发;构建 foo-core 并将其部署到 Nexus 中的快照存储库。
  • 开发人员 A 在 foo-webapp 上运行 mvn install。 Maven 正在检查 Nexus,并发现 Nexus 中有更新版本的 foo-core。它下载它(充满了开发人员 B 的更改),然后编译失败,因为开发人员 A 所做的更改不在本地存储库中的 jar 中。下载会覆盖开发者 A 在此处安装的文件。

现有解决方案

我查看了 maven-deploy-plugin,但这个插件部署了附加到项目的所有工件。如果他们有办法配置要部署的工件,那就太好了。

问题:有没有什么办法可以解决这个问题,而无需借助基于 maven-deploy-plugin 编写我自己的部署插件?

【问题讨论】:

    标签: maven maven-deploy-plugin


    【解决方案1】:

    基本上给-Dfile参数,而不是神器,传递pom.xml。运行命令,耶! mvn deploy 现在不会给你任何问题。这是一个示例部署命令:

    $ mvn deploy:deploy-file -DpomFile=pom.xml -Dfile=./pom.xml -DgroupId=my.group.id -DartifactId=artifact-id -DrepositoryId=bigdata-upload-snapshots -Durl=http://maven.mymaven.com/content/repositories/snapshots/
    

    先决条件是在您的 settings.xml 中添加存储库

    [编辑]:我在示例部署命令中提供了项目的参数-DgroupId-DartifactId,但它们不是必需的(请参阅下面 Zac 的评论)

    【讨论】:

    • 如果你使用-DpomFile=你不需要使用groupId和artifactId;这些将从 pom 中推断出来。
    【解决方案2】:

    这适用于我仅部署 pom 文件(例如在现有 jar 旁边):
    注意:您还需要指定包装,否则它将作为.xml 文件上传,这不是您想要的。)

    mvn deploy:deploy-file \
    -Dfile=pom.xml \
    -Dpackaging=pom \
    -DgroupId=com.mycompany.package \
    -DartifactId=my-artifact \
    -Dversion=2.0.1 \
    -DrepositoryId=serverIdFromSettingsXMLForCredentials \
    -Durl=http://repositoryserver/myrepo/
    

    【讨论】:

      【解决方案3】:

      不完全是这些人所要求的答案。我的情况是我只想部署父 pom。我在子模块中使用spring-boot-thin-layout。这需要将父模块部署到工件中。我将以下内容添加到我的项目中。它可以跳过install 和/或deploy 阶段。

      在我的父 pom 中:

      <properties>
          <disable.install>true</disable.install>
          <disable.deploy>true</disable.deploy>
          <enable.deployAtEnd>true</enable.deployAtEnd>
      </properties>
      
      <profiles>
          <profile>
              <id>deploy-parent</id>
              <activation>
                  <activeByDefault>true</activeByDefault>
              </activation>
              <properties>
                  <disable.install>true</disable.install>
                  <disable.deploy>true</disable.deploy>
                  <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
              </properties>
              <build>
                  <finalName>${project.version}</finalName>
              </build>
          </profile>
      </profiles>
      

      在我的孩子 pom(s) 或您不想与父级一起部署的任何模块中:

      <properties>
          <maven.install.skip>${disable.install}</maven.install.skip>
          <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
          <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
      </properties>
      

      当我在父 pom 上运行 mvn deploy 时非常有效,它将编译所有模块,而不是在任何东西上运行 install,然后最后部署任何没有 ` 的模块

      【讨论】:

        【解决方案4】:

        我从未听说过这种可能性,如果可能的话,我也会感到非常惊讶。由于 pom 和生成的工件是某种单元,因此(对我而言)只部署其中的一部分是没有意义的。

        尽管如此,您应该考虑创建一个单独的 pom 项目,其中指定了您可能希望在 JAR/WAR 项目中使用的依赖项和插件,如下所示:

        <groupId>foo.bar</groupId>
        <artifactId>my-pom</artifactId>
        <version>1.0.0</version>
        <packaging>pom</packaging>
        

        然后通过您的 JAR/WAR 项目继承该 pom 项目,如下所示:

        <parent>
            <groupId>foo.bar</groupId>
            <artifactId>my-pom</artifactId>
            <version>1.0.0</version>
        </parent>
        

        这称为project inheritance。您可以独立于“子”工件更改和部署您的 pom 项目。

        编辑阅读动机后:

        据我了解,您希望阻止 maven 从存储库中解析 SNAPSHOT 工件(这样本地版本就不会被覆盖)。您是否尝试过使用 mvn -nsu 选项(请参阅 mvn -help)?

        -nsu,--no-snapshot-updates             Suppress SNAPSHOT updates
        

        我从未尝试过,但发现此报告 issue。尽管如此,我还是会试一试(因为该问题尚未评论)。

        【讨论】:

        • 我已经编辑了我的问题并添加了请求的动机以更好地澄清我的问题。
        • 我同意@FrVaBe 的观点,并且不认为你的要求可以做到,我也不认为这是解决你情况的最佳方法。 -nsu-o(离线)标志对于开发人员 A 避免该问题很有用。但是,如果开发人员 A 正在从多模块项目的顶层构建代码,则没有必要,因为他的本地版本 foo-core 将优先于 Hudson 部署的新版本。最后,默认情况下,Maven 每 24 小时仅查找一次快照更新,因此每个环境每天最多会发生一次这种情况。
        最近更新 更多