使用 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.xmlscm 部分调整为如下所示。必须特别调整连接才能正常工作。 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

但是,如果您想发布单个片段,这将无济于事。在这种情况下,您只需将 元素复制到所有 pom 中。

这是 maven 开发人员列表上的一个活跃讨论话题,但不要屏住呼吸寻找那里的解决方案;这是一件大事。

【讨论】:

看起来该项目是从*** POM 发布的,而不是像我尝试做的那样从单个模块发布。当我尝试从其中一个模块的目录中释放时,出现了我遇到的问题。能够发布单个模块对我来说很重要,因为模块版本不同,我不想同时增加所有模块版本。 我从未见过有人这样做。 感谢您的信息。你碰巧有链接到 maven 开发列表中讨论过的任何线程吗? mail-archives.apache.org/mod_mbox/maven-dev/201107.mbox/ajax/… 我在那个线程上看到了你的帖子。 FWIW,我喜欢定义一次 SCM 信息(在父 POM 中)而不让 Maven 修改它的想法。

以上是关于使用 Git 发布多模块 maven 项目的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将多模块 Maven 项目拆分为不同的 Git 存储库?

(转)在Eclipse中创建Maven多模块工程

使用 Spring 在多模块 Maven 项目中进行集成测试

Maven使用Maven构建多模块项目

使用 Jenkins 部署多模块 maven 项目

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?