我正在尝试发布一个使用git作为SCM的多模块maven项目,我遇到的第一个问题是maven发布插件构建release.properties scm.url的方式。我的父母POM看起来像这样:
<packaging>pom</packaging>
<groupId>org.project</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scm>
<connection>scm:git:git://github.com/username/project.git</connection>
<developerConnection>scm:git:git@github.com:username/project.git</developerConnection>
<url>http://github.com/username/project</url>
</scm>
<modules>
<module>api</module>
<module>spi</module>
</modules>
模块POM很简单:
<parent>
<groupId>org.project</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>api</artifactId>
<version>0.2.2</version>
我的目标是能够发布单个模块,因为它们各自具有不同的版本,并且我不希望每次发布时都将所有版本一起增加。
当我切换到api
目录并执行mvn release:clean release:prepare
时,我遇到了以下输出:
[INFO] Executing: cmd.exe /X /C "git push git@github.com:username/project.git/api master:master"
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to commit files
Provider message:
The git-push command failed.
Command output:
ERROR: Repository not found.
看起来maven发布插件通过将模块名称附加到developerConnection
来创建scm.url,这最终不是github上的有效存储库。我不确定设置它的正确方法是什么。可能是Maven + git +发布单个子模块根本不起作用的情况?任何意见都表示赞赏。
答案 0 :(得分:14)
要了解如何使其工作,请查看一个工作示例,例如:
https://github.com/sonatype/sonatype-aether
但是,如果您想要发布单件,这将无济于事。在这种情况下,您只需要复制&lt; scm&gt;所有的poms元素。
这是关于maven开发列表讨论的一个活跃主题,但不要屏住呼吸从那里获得解决方案;这是一个大问题。
答案 1 :(得分:12)
我通过搜索“git-push命令失败”找到了这个问题。我有一个类似的配置,我有一个master-pom,然后我发布的子模块作为他们自己的maven包。
为了让它发挥作用,我必须将scm
的{{1}}部分调整为以下内容。特别需要调整连接才能正常工作。 github的所有人都没有工作。
pom.xml
上例中的<scm>
<url>https://github.com/XXX/YYY</url>
<connection>scm:git:ssh://git@github.com/XXX/YYY.git</connection>
<developerConnection>scm:git:ssh://git@github.com/XXX/YYY.git</developerConnection>
</scm>
是您的github用户名。您无法使用XXX
格式(:XXX
),因为git@github.com:XXX/...
之后的值会被解释为端口号。 :
显然是YYY
帐户下的存储库名称。
我刚刚成功使用此模式逐个发布了所有3个子模块。
答案 2 :(得分:1)
对于那些像我一样寻求一个好解决方案的人来说,我发现对我有用的是:
http://blog.avisi.nl/2012/02/15/maven-release-plugin-setup-guide-for-git/
你仍然“标记”了整个主干,因为这就是git的工作方式,但它允许你只构建/版本/部署你想要的子模块。
答案 3 :(得分:1)
我试图在很长一段时间内做类似的事情,从来没有找到一个好的解决方案,所以为git写了我自己的发布插件。它只发布已更改的模块,您不需要任何scm配置,它根据模块名称进行标记,并且组件间依赖性可以工作。
文档:http://danielflower.github.io/multi-module-maven-release-plugin/index.html
简介博客:http://danielflower.github.io/2015/03/08/The-Multi-Module-Maven-Release-Plugin-for-Git.html
答案 4 :(得分:0)
一个简单的方法,对我有用的是使用模块pom.xml
中的父属性,例如跟随scm
标记,如下所示:
<!--module pom.xml-->
<scm>
<connection>${project.parent.scm.connection}</connection>
<developerConnection>${project.parent.scm.developerConnection}</developerConnection>
</scm>
答案 5 :(得分:0)
我知道这是迟来的响应,但是我遇到了同样的问题,当您执行以下操作时,您可以实现多模块maven项目和每个模块的独立发行版的唯一解决方案:
基本上,在git中,每个maven模块都将作为其自己的项目存在。 Maven父项目将有一个单独的git项目,但其中不包含实际模块,只有git子模块链接到存储实际项目的git位置。
答案 6 :(得分:0)
我回答了一个相关的问题here (multi-module with multi-repository)。基本上,您可以使用一个名为commitByProject的属性,因为maven-release-plugin 2.0-beta-5使您可以为每个项目提交每个子模块(使用'git submodule add'策略从root pom引用也可以)。
mvn release:prepare -DcommitByProject=true