【问题标题】:Releasing a multi-module maven project with Git使用 Git 发布多模块 maven 项目
【发布时间】: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 + 发布单个子模块根本行不通?任何意见表示赞赏。

【问题讨论】:

    标签: git maven github


    【解决方案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 项目和每个模块的独立版本的解决方案是执行以下操作:

      1. 为 maven 多模块项目设置一个 GIT 项目
      2. 为 (1) 中的每个 maven 模块在 (1) 中添加一个 GIT 子模块
      3. 将每个 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 开发列表中讨论过的任何线程吗?
              • 我在那个线程上看到了你的帖子。 FWIW,我喜欢定义一次 SCM 信息(在父 POM 中)而不让 Maven 修改它的想法。
              猜你喜欢
              • 2013-03-11
              • 1970-01-01
              • 2020-05-27
              • 1970-01-01
              • 2012-07-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多