我有一个带有子项目的项目,想要对孩子进行maven释放(项目B):
Project-A/
pom.xml
Project-B/
pom.xml
src/
Project-A的文件夹同时是我的git存储库,我从我们的中央git服务器克隆。
对于我们的发布,我们使用jenkins作为构建服务器和Jenkins Maven Release Plug-in来启动发布版本。
因此,在jenkins Job(称为JobB)启动后,它会将Project-A文件夹签出到以下位置:/Users/titan/.jenkins/jobs/JobB/workspace
。
由于git是如何工作的,我只能克隆我的结构的顶层。所以这意味着我需要将我想要在jenkins中构建的pom设置为Project-B / pom.xml,然后将更改maven用于执行其工作的工作目录。
这会导致git出现很多问题,因为maven发布插件会尝试提交到错误的目录(它假定Project-A / Project-B /是一个有效的git存储库)。我可以解决所有这些问题(通过在执行发布时停用推送到远程仓库并在执行发布时指定正确的scm url。)
这是jenkins JobB配置中Release goals and options
字段的值:
-X -DpreparationGoals="clean install"
-DpushChanges=false
-DconnectionUrl=scm:git:file:///Users/titan/.jenkins/jobs/JobB/workspace
release:prepare release:perform
需要connectionUrl的文件URL,因为我没有将更改推送到git远程服务器,并且在maven开头执行的克隆:perform将找不到需要签出的标记。
毕竟这是我的问题,我无法解决:
maven:准备步骤贯穿并完成所有工作(更改pom中的版本号,创建发布标记)。
然后启动maven:perform
步骤,将内容从git存储库克隆,将checkouts标记克隆到目标文件夹,然后调用deploy命令。
但是这里是在顶层调用调用的deploy命令的问题,因此它正在部署Project-A而不是Project-B。作业本身正在运行,没有任何错误,只是构建和部署错误的东西。
这是maven生成的命令,用于执行deploy:
[INFO] Executing goals 'deploy'...
[DEBUG] Using ${maven.home} of: '/usr/share/java/maven-3.0.3'.
[DEBUG] Executing: /bin/sh -c cd /Users/titan/.jenkins/jobs/jobB/workspace/Project-B/target/checkout && /usr/share/java/maven-3.0.3/bin/mvn -B -X -D maven.repo.local=/Users/titan/.m2/repository -s /Users/titan/.m2/settings.xml -D performRelease=true deploy
所以它在checkout目录中调用pom文件而不是checkout / Project-B。有趣的是,maven:准备步骤确实在正确的pom上执行。
不使用jenkins,直接从shell调用mvm命令。这给了我相同的结果。所以我认为詹金斯不是问题。
使用-Darguments="-f sword-packaging-wbf/pom.xml"
和-Darguments="-DpomFileName=sword-packaging-wbf/pom.xml"
两种方法都不会改变结果中的任何内容。在查看输出时,我发现-f <path>
在生成的命令中被忽略,因为-DpomFileName
可见但不会改变结果中的任何内容。
答案 0 :(得分:6)
所以这意味着你的组织完全错了。将您的父母放入一个单独的maven模块(也是单独的git repos)释放它。在您的子模块中,只需使用父模块,让您的孩子分开maven模块以及git repos并单独释放它们。而已。否则你开始与Maven战斗,你将失去战斗力。