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

Joe*_*erg 6 git maven multi-module maven-release-plugin

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

文件夹结构如下所示:

  |- api/pom.xml
  |- database/pom.xml
  |- core/pom.xml
  pom.xml
Run Code Online (Sandbox Code Playgroud)

父pom简单地用作以通过使用<modules>标记有意义的方式构建所有子组件的方式.从本质上讲,构建api,然后是数据库,然后是核心.

该项目最初是在SVN中托管的,只需指向maven scm标签中存储库中的不同路径,就可以很容易地获得maven release命令.Git似乎不是这样.

在运行时,mvn release:prepare它会根据需要对api pom执行更改,但在执行时mvn release:perform会尝试构建父pom,并且由于无法解析database/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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

databasePOM看起来很像api,但有一个依赖关系api.同样适用core,这取决于database(并通过它api).

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

khm*_*ise 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)
Run Code Online (Sandbox Code Playgroud)

最好的方法是在Maven中使用继承,这意味着在每个模块api,core,database中都使用这样的父类:

<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>
Run Code Online (Sandbox Code Playgroud)

这使您可以选择将api,core和database中常见的所有内容放入父级.例如,您应该仅将许可证信息放入父级,其属性如下:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
Run Code Online (Sandbox Code Playgroud)

此外,您可以将有关您正在使用的插件的信息放入父级,如:

  <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>
        ...
Run Code Online (Sandbox Code Playgroud)

当然,你必须在父母和其他许多事情中只定义一次scm区域.

此外,还可以并建议将dependencyManagement定义到父级中,这使您有机会仅在一个点上使用适当的版本定义依赖关系,而无需在模块中定义版本.

这将大大减小模块中的pom的大小.

结果将是通过单个mvn release:prepare等从父母释放,但是将产生不同的工件,例如hydra-api,hydra-core并且hydra-database具有相同的版本号,这将确保具有彼此相关的api,核心等.