【问题标题】:Releasing a multi-module Maven project hosted in single Git repository发布托管在单个 Git 存储库中的多模块 Maven 项目
【发布时间】:2012-07-16 18:01:21
【问题描述】:

我正在尝试发布包含在单个 git 存储库中的多模块项目的各个模块。

文件夹结构如下所示:

  |- api/pom.xml
  |- database/pom.xml
  |- core/pom.xml
  pom.xml

父 pom 只是用作构建所有子组件的一种方式,这种方式通过使用 <modules> 标记是有意义的。本质上,构建 api,然后是数据库,然后是核心。

该项目最初托管在 SVN 中,只需在 maven scm 标签中指向存储库中的不同路径,就很容易让 maven release 命令玩得很好。 Git似乎不是这种情况。

在运行mvn release:prepare 时,它会根据需要对 api pom 进行更改,但在执行mvn release:perform 时,它会尝试构建父 pom,并且由于无法解析 api-snapshot 依赖关系而无法构建数据库包在 database/pom.xml 中列出。

我应该如何配置我的 scm 标签才能在 Git 存储库中发布特定模块?这甚至可能吗?

编辑:添加 pom 示例

以下是 pom 文件外观的示例设置:

父 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.findwise.hydra</groupId>
  <artifactId>hydra-parent</artifactId>
  <version>0.2.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>api</module>
    <module>database</module>
    <module>core</module>
  </modules>
</project>

api/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.findwise.hydra</groupId>
  <artifactId>hydra-api</artifactId>
  <packaging>jar</packaging>
  <version>0.2.0</version>
  <name>${project.artifactId}</name>
  <description>Hydra API</description>

  <licenses>
    ...
  </licenses>

  <scm>
    ...
  </scm>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    ...
  </dependencies>

  <build>
    <finalName>${project.name}</finalName>
    <plugins>
      ...
    </plugins>
  </build>
</project>

database pom 看起来很像api,但依赖于api。 core 也是如此,它依赖于database(并通过它依赖于api)。

api 和 database 工件本身很重要,因为 api 定义了客户端 API,database 定义了后端 API,两者都用于与应用程序集成。由此产生了单独发布它们的最初想法——父 pom 只是事后的想法,以允许更简单地构建整个堆栈。

【问题讨论】:

  • 您是否在您的 api、数据库或核心模块中使用父标签来引用您父 pom 中的内容?

标签: git maven maven-release-plugin multi-module


【解决方案1】:

发布多模块构建的通常方法是从根位置开始,这也意味着释放它的所有子模块。不单独发布单个模块。如果您尝试这样做,您将失去版本之间的关系。

如果您真的想单独发布模块,只需从中创建单独的 maven 项目,并为每个模块分配一个 git 存储库。

你提到的树看起来真的很像一个多模块构建,应该从根目录一步发布。

根据您更新的内容,我可以建议您使用真正的多模块构建,其结构如下:

root
 +-- pom.xml (1.0-SNAPSHOT)
 !
 +-- api 
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- database
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- core
       +-- pom.xml (1.0-SNAPSHOT)

最好是在 Maven 中使用继承,这意味着在每个模块 api、核心、数据库中使用这样的父级:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.findwise.hydra</groupId>
    <artifactId>hydra-parent</artifactId>
    <version>0.2.0-SNAPSHOT</version>
  </parent>

  <artifactId>hydra-api</artifactId>

  <description>Hydra API</description>

这使您可以选择将 api、核心和数据库中常见的所有内容放入父级。例如,您应该只将许可证信息放入父级中,例如它们的属性:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

此外,您还可以将您正在使用的信息 about plugins 放入父级中,例如:

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>1.6</source>
            <target>1.6</target>
          </configuration>
        </plugin>
        ...

当然,您必须在父级中定义一次 scm 区域,以及许多其他内容。

还可以并建议将dependencyManagement 定义到父级中,这使您有机会仅在某一时刻使用适当的版本定义依赖项,而无需在模块中定义版本。

这将大大减少模块中 pom 的大小。

结果将通过单个mvn release:prepare 等从父级释放,但会产生不同的工件,例如hydra-api、hydra-core 和hydra-database,它们具有相同的版本号,这将确保具有 api、core等相互对应。

【讨论】:

  • 我没有在模块 pom.xml 中使用父标签。根目录中的“父”pom 或多或少只是为了允许以正确的顺序构建核心和所有其他组件。我是否需要在“子模块”POM 中使用父标签?父级的一步发布会释放所有模块工件,还是只是某种超级工件?
  • 如果你使用它以正确的顺序构建你有来自例如的依赖项核心到 api 等。在这种情况下,我建议按照我的描述从一个点进行真正的多模块构建和发布。你能发布你的父 pom 或者一个模块吗?让讨论更简单。
  • 添加了有关 poms 的更多信息。感谢您提出的任何建议! :)
  • 很好的建议。谢谢!这次我最终手动发布,但会按照您的建议重新排列 pom - 看起来是正确和最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2014-08-03
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多