0

我有一个多模块 Maven 项目,例如

A B C D E 目前这个项目运行良好,只有一个工作来构建所有模块并上传到工件,例如 4.0.0-。他们正在使用版本:set -DnewVersion=4.0.0-${BUILD_NUMBER} Jenkins 工作。现在我的下一个任务是将这个项目拆分为模块,以便他们的开发团队可以独立构建每个模块,但我的问题是某些模块依赖于其他模块,例如

模块 B 依赖于模块 A 和模块 C。如果我先构建模块 A,然后它生成数字 4.0.0-00001 并将其上传到工件,然后我构建模块 C,然后它生成构建 4.0.0 -00005。现在问题来了,我如何构建依赖于模块 A 和 C 的模块 B。我认为我需要在依赖部分明确定义模块 A 和 C 的版本。

     <dependency>
        <groupId>com.xyz.engine</groupId>
        <artifactId>A</artifactId>
        <version>4.0.0-00005</version>
     </dependency>

从我的模块 POM 我调用我的父 POM 并且在 jenkins 工作中我给出版本:set -DnewVersion=4.0.0-${BUILD_NUMBER} 用于版本控制,如果我明确定义 A 模块的版本,那么它也传递相同父 POM 的值并搜索它是不可用的。下面是我的模块 POM 文件

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.truvenhealth.analyticsengine</groupId>
        <artifactId>AnalyticsEngine</artifactId>
        <version>4.0.0-00002</version>
    </parent>

    <artifactId>LicenseVerifier</artifactId>
    <name>LicenseVerifier</name>
    <packaging>jar</packaging>

    <dependencies>
        <!-- Modules dependencies -->
        <dependency>
            <groupId>com.xyz.engine</groupId>
            <artifactId>Common</artifactId>
            <version>4.0.0-00007</version>
         </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
        </dependency>



        <!-- External dependencies -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>1.6.2</version>
        </dependency>

        <dependency>
            <groupId>com.verhas</groupId>
            <artifactId>license3j</artifactId>
            <version>1.0.4</version>
        </dependency>

    </dependencies>


    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>

        <plugins>
            <!-- Plugin configurations inherited from the parent POM -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

它为我分配给公共模块的父 POM 采用相同的值。我将父 POM 保存在单独的存储库中它不应该采用相同的值它应该只采用我为父 POM 定义的值并且它应该下载它来自他们并向模块 POM 提供所有值,并且应该为具有不同版本的模块 LicenseVerifier 创建构建。

4

1 回答 1

0

如果您有一个如下所示的多模块构建:

root (pom.xml parent of all modules)
 +---- module-a (pom.xml)
 +---- module-b (pom.xml)
 +---- module-c (pom.xml)
 +---- module-d (pom.xml)

要单独构建模块,您可以通过 Maven 执行此操作,如下所示:

mvn -pl module-a  clean package

这将构建module-a唯一的并从远程存储库中获取其他模块的依赖关系。或者你可以像这样增强它:

mvn -pl module-a -amd clean package

选项的-amd含义在哪里--also-make-dependents。如果开发人员需要特定状态,您可以mvn install先构建您想要构建的模块,然后再构建。

与多模块构建相关的一个非常重要的事情是所有模块和父模块具有相同的版本。所以这些模块之间的依赖关系是没有问题的。

Maven 3.2.1开始,您可以通过属性定义版本。

一个简单的更改,以防止 Maven 发出有关具有属性表达式的版本的警告。版本中允许的属性表达式包括 ${revision}、${changelist} 和 ${sha1}。这些属性可以在外部设置,但最终会在 Maven 中创建一种机制,这些属性可以以标准方式注入。例如,您可能想要收集当前的 Git 修订版并将该值注入 ${sha1}。这绝不是持续交付的完整解决方案,而是朝着正确方向迈出的一步。

此外,在开发过程中,我更喜欢存储库管理器中的清理更简单的 SNAPSHOT 版本。所以本质上我不需要分离逻辑上属于一起的模块。

除此之外,如果您在多模块构建中使用相同的版本,您可以使用以下内容:${project.version}定义作为反应器一部分的依赖项的版本。

于 2015-04-23T10:34:11.220 回答