使用 Git 发布多模块 maven 项目
Posted
技术标签:
【中文标题】使用 Git 发布多模块 maven 项目【英文标题】:Releasing a multi-module maven project with Git 【发布时间】:2011-10-07 08:00:03 【问题描述】:我正在尝试发布一个使用 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 + 发布单个子模块根本行不通?任何意见表示赞赏。
【问题讨论】:
【参考方案1】:我回答了一个相关问题here (multi-module with multi-repository)。基本上,您可以使用一个名为 commitByProject 的属性,从 maven-release-plugin 2.0-beta-5 开始,它可以让您提交每个项目的每个子模块(从根 pom 引用,使用 'git submodule add' 策略也可以)。
mvn release:prepare -DcommitByProject=true
【讨论】:
【参考方案2】:我知道回复晚了,但我遇到了同样的问题,唯一可以同时实现多模块 maven 项目和每个模块的独立版本的解决方案是执行以下操作:
-
为 maven 多模块项目设置一个 GIT 项目
为 (1) 中的每个 maven 模块在 (1) 中添加一个 GIT 子模块
将每个 GIT 子模块 (2) 链接到它自己的 GIT 项目
本质上,在 git 中,每个 maven 模块都将作为自己的项目存在。 maven 父项目会有一个单独的 git 项目,但它不会包含实际的模块,只有 git 子模块链接到存储实际项目的 git 位置。
【讨论】:
【参考方案3】:一种简单的方法,对我有用的是使用模块pom.xml
中的父属性,比如在scm
标签中使用如下:
<!--module pom.xml-->
<scm>
<connection>$project.parent.scm.connection</connection>
<developerConnection>$project.parent.scm.developerConnection</developerConnection>
</scm>
【讨论】:
【参考方案4】:我一直在尝试做类似的事情,但一直没有找到好的解决方案,所以写了我自己的 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
【讨论】:
在使用您的插件时,我遇到了身份验证问题。如何在没有任何 java 代码的情况下为 JGit 设置凭据。另外,您的插件是否与 BitBucket 兼容?【参考方案5】:对于任何像我一样寻求良好解决方案的人来说,我发现对我有用的是:
http://blog.avisi.nl/2012/02/15/maven-release-plugin-setup-guide-for-git/
您仍然“标记”整个主干,因为这就是 git 的工作方式,但它只允许您构建/版本/部署您想要的子模块。
【讨论】:
【参考方案6】:我在搜索“git-push command failed”时发现了这个问题。我有一个类似的配置,我有一个 master-pom,然后是我作为自己的 maven 包发布的子模块。
为了让它工作,我必须将pom.xml
的scm
部分调整为如下所示。必须特别调整连接才能正常工作。 github 上没有一个能正常工作。
<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>
以上示例中的XXX
是您的github 用户名。您不能使用:XXX
格式(git@github.com:XXX/...
),因为:
之后的值被解释为端口号。 YYY
显然是您在XXX
帐户下的存储库名称。
我刚刚成功地使用此模式一一发布了我的所有 3 个子模块。
【讨论】:
【参考方案7】:要了解如何进行这项工作,请查看一个工作示例,例如:
https://github.com/sonatype/sonatype-aether
但是,如果您想发布单个片段,这将无济于事。在这种情况下,您只需将
这是 maven 开发人员列表上的一个活跃讨论话题,但不要屏住呼吸寻找那里的解决方案;这是一件大事。
【讨论】:
看起来该项目是从*** POM 发布的,而不是像我尝试做的那样从单个模块发布。当我尝试从其中一个模块的目录中释放时,出现了我遇到的问题。能够发布单个模块对我来说很重要,因为模块版本不同,我不想同时增加所有模块版本。 我从未见过有人这样做。 感谢您的信息。你碰巧有链接到 maven 开发列表中讨论过的任何线程吗? mail-archives.apache.org/mod_mbox/maven-dev/201107.mbox/ajax/… 我在那个线程上看到了你的帖子。 FWIW,我喜欢定义一次 SCM 信息(在父 POM 中)而不让 Maven 修改它的想法。以上是关于使用 Git 发布多模块 maven 项目的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将多模块 Maven 项目拆分为不同的 Git 存储库?