发布托管在单个Git存储库中的多模块Maven项目

时间:2012-07-17 18:45:44

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

我正在尝试发布包含在单个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,并且由于无法解析数据包而无法构建数据库包数据库/ pom.xml中列出的api-snapshot依赖。

如何配置我的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)。

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

1 个答案:

答案 0 :(得分:7)

发布多模块构建的常用方法是从根位置执行此操作,这也意味着使用它释放所有子模块。不单独释放单个模块。如果你试图这样做,你将失去版本之间的关系。

如果你真的想单独发布这些模块,只需要从中创建单独的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,core,数据库中使用这样的父类:

<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,core和database中常见的所有内容放入父级。例如,您应该仅将许可证信息放入父级,如下所示的属性:

  <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-apihydra-corehydra-database等不同的工件这将确保 api 核心等相互依存。