如何仅将pom文件部署到Maven中的快照存储库中?
我希望在运行如何仅将pom文件部署到Maven中的快照存储库中?,maven,maven-deploy-plugin,Maven,Maven Deploy Plugin,我希望在运行mvndeploy且版本为快照版本时,能够只部署POM工件(文件),而不部署主工件(JAR、WAR等) 为什么? 我们需要几个开发人员在多个Maven项目上工作。我们有一个Hudson服务器,每个Maven项目和版本都有一个作业(例如foo-1.2、foo-1.3)。每个作业构建项目并将其部署到Nexus服务器(成功后)。开发中的Maven项目通过在版本中使用-SNAPSHOT后缀进行标记。例如:1.2-SNAPSHOT、1.3-SNAPSHOT 下面是一个示例场景,说明开发人员的工
mvndeploy
且版本为快照版本时,能够只部署POM工件(文件),而不部署主工件(JAR、WAR等)
为什么?
我们需要几个开发人员在多个Maven项目上工作。我们有一个Hudson服务器,每个Maven项目和版本都有一个作业(例如foo-1.2、foo-1.3)。每个作业构建项目并将其部署到Nexus服务器(成功后)。开发中的Maven项目通过在版本中使用-SNAPSHOT后缀进行标记。例如:1.2-SNAPSHOT、1.3-SNAPSHOT
下面是一个示例场景,说明开发人员的工作是如何因这种体系结构而受损的
假设有两个Maven项目:FooCore和FooWebApp,都是1.2-SNAPSHOT版本
- 开发人员A正在开发FooCore,做了一些更改并编译了它
- 开发者A继续工作,但在FooWebApp上
- 开发人员B开始工作并更改foo核心。它提交他的工作并将其推送到SCM
- Hudson由单片机触发;构建foo core并将其部署到Nexus中的快照存储库中
- 开发者A正在foo webapp上运行
。Maven正在检查Nexus,发现Nexus中有一个更新版本的foo core。它下载它(充满了开发人员B的更改),但编译失败,因为开发人员A所做的更改不在本地存储库中的jar中。下载会覆盖由开发人员A安装的文件mvn安装
问题:有没有办法解决这个问题而不用基于maven deploy plugin编写自己的deploy插件?我从未听说过这种可能性,如果可能的话,我也会非常惊讶。由于pom和生成的工件是某种类型的单元,所以(对我来说)只部署它们的一部分是没有意义的
不过,您应该考虑制定一个单独的POM项目,它指定您可能要在您的jar /战争项目中使用的依赖项和插件:
<groupId>foo.bar</groupId>
<artifactId>my-pom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<parent>
<groupId>foo.bar</groupId>
<artifactId>my-pom</artifactId>
<version>1.0.0</version>
</parent>
我从未试过,但发现了这个。尽管如此,我还是会尝试一下(因为这个问题还没有被评论)。基本上是针对
-Dfile
参数,而不是工件,传递pom.xml
,但仅仅这样做是不够的。您还需要提供项目的参数-DgroupId
和-DartifactId
。运行命令,耶<代码>mvn部署现在不会给您带来任何问题。下面是一个示例部署命令:
$ 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/
这样做的一个先决条件是在您的设置中添加存储库。xml不完全是这些人想要的答案。我的情况是我只想部署父pom。我在子模块中使用了
spring boot精简布局
。这需要将父模块部署到artifactory中。我在我的项目中添加了以下内容。它允许跳过安装
和/或部署
阶段
在我的父母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>
真的
真的
真的
部署父级
真的
真的
真的
${enable.deployAtEnd}
${project.version}
以及“我的孩子pom”或任何您不希望与家长一起部署的模块中的:
<properties>
<maven.install.skip>${disable.install}</maven.install.skip>
<maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
<deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>
${disable.install}
${disable.deploy}
${enable.deployAtEnd}
因此,当我在父pom上运行
mvn deploy
时,它将编译所有模块,而不是在任何东西上运行install,然后在最后部署任何没有“的模块。这只适用于部署pom文件(例如,在现有jar旁边):(注意:您还需要指定打包,否则它将作为
.xml
文件上载,而这不是您想要的。)
我已经编辑了我的问题,并添加了请求的动机,以便更好地澄清我的问题。我同意@FrVaBe,我不认为你的问题可以解决,我也不认为这是解决你的问题的最好办法。
-nsu
和-o
(脱机)标志对于开发人员A避免该问题非常有用。但是,如果开发人员A是从多模块项目的顶层构建代码,则不必这样做,因为他的本地版本的foo core将优先于Hudson部署的新版本。最后,默认情况下,Maven每24小时只查找一次快照更新,因此这种情况在每个环境中每天最多发生一次;这些将从pom中推断。
<properties>
<maven.install.skip>${disable.install}</maven.install.skip>
<maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
<deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>
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/