如何在Maven中仅将pom文件部署到我的快照存储库?

时间:2011-05-26 10:59:21

标签: maven maven-deploy-plugin

我希望在运行mvn deploy且版本为SNAPSHOT版本时,只能部署没有主工件(JAR,WAR等)的POM工件(文件)。

为什么吗

我们有几个开发人员从事多个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?

4 个答案:

答案 0 :(得分:12)

基本上-Dfile参数,而不是工件,传递pom.xml,但这样做是不够的。您还需要提供项目的参数-DgroupId-DartifactId。运行命令,耶! 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

答案 1 :(得分:2)

我从未听说过这种可能性,如果可能的话,也会非常惊讶。由于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。不过我会尝试一下(因为问题还没有评论)。

答案 2 :(得分:1)

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

.xml

答案 3 :(得分:0)

这些人所要求的答案不完全是。我的情况是我只想部署父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或您不想与父项一起部署的任何模块:

<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,然后最后部署不包含`