4

设置

我有一个带有子项目的项目,并且想做一个子项目的 maven 版本(项目 B):

Project-A/
  pom.xml
  Project-B/
    pom.xml
    src/

Project-A 的文件夹同时也是我的 git 存储库,我从我们的中央 git 服务器克隆了它。

对于我们的发布,我们使用 jenkins 作为构建服务器和 Jenkins Maven 发布插件来启动发布构建。

因此,在 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。)

这是Release goals and optionsjenkins JobB 配置中字段的值:

-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:prepare 步骤贯穿并完成所有工作(更改 pom 中的版本号,创建发布标签)。然后该maven:perform步骤开始,从 git 存储库克隆内容,将 checkouts 标记放入目标文件夹,然后调用部署命令。

但这是在顶层调用调用的部署命令的问题,因此它正在部署 Project-A 而不是 Project-B。作业本身正在运行,没有任何错误,它只是在构建和部署错误的东西。

这是 maven 为执行部署而生成的命令:

[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:prepare 步骤确实在正确的 pom 上执行。

到目前为止我尝试了什么

  • 不使用 jenkins,而是直接从 shell 调用 mvm 命令。这给了我同样的结果。所以我认为詹金斯不是问题。

  • -Darguments="-f sword-packaging-wbf/pom.xml"用and 改变 pom 的路径-Darguments="-DpomFileName=sword-packaging-wbf/pom.xml"

    这两种方法都不会改变结果。查看输出,我发现-f <path>在生成的命令中忽略了 ,因为-DpomFileName是可见的,但不会改变结果中的任何内容。

4

1 回答 1

8

所以这意味着你的组织完全错了。将您的父级放入一个单独的 Maven 模块(也是单独的 git repos)中释放它。在您的子模块中,只需使用父模块并让您的孩子分开 maven 模块以及 git repos 并分别发布它们。就是这样。否则,您开始与 Maven 战斗,您将失去战斗。

于 2012-04-27T07:46:38.867 回答