我希望在运行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版本。
mvn install
。 Maven正在检查Nexus,并发现Nexus中有更新版本的foo-core。它下载它(填充了开发人员B的更改)而不是编译失败,因为开发人员A所做的更改不在位于本地存储库中的jar中。下载将覆盖开发人员A安装的文件。现有解决方案
我查看了maven-deploy-plugin,但是这个插件部署了附加到项目的所有工件。如果他们有办法配置要部署的工件,那就太好了。
问题:有没有办法解决这个问题而不依靠编写我自己的部署插件,基于maven-deploy-plugin?
答案 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,然后最后部署不包含`