使用Git发布多模块maven项目

时间:2011-07-17 23:23:39

标签: git maven github

我正在尝试发布一个使用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 +发布单个子模块根本不起作用的情况?任何意见都表示赞赏。

7 个答案:

答案 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项目和每个模块的独立发行版的唯一解决方案:

  1. 对于Maven多模块项目,请设置一个GIT项目
  2. 为(1)中的每个maven模块在(1)中添加一个GIT子模块
  3. 将每个GIT子模块(2)链接到其自己的GIT项目

基本上,在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