9

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

文件夹结构如下所示:

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

<modules>父 pom 只是用作构建所有子组件的一种方式,这种方式通过使用标签是有意义的。本质上,构建 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>

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>

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

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

4

1 回答 1

10

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

如果您真的想单独发布模块,只需从中创建单独的 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>

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

  <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具有相同的版本号,这将确保apicore等彼此一致。

于 2012-07-18T07:35:09.890 回答