【问题标题】:Parent POM is taking the same version which I am giving in the module version父 POM 采用的版本与我在模块版本中提供的版本相同
【发布时间】:2015-04-22 22:50:40
【问题描述】:

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

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

模块 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 并且在詹金斯的工作中我正在给 版本:设置 -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 创建构建。

【问题讨论】:

    标签: maven-3 pom.xml parent-pom


    【解决方案1】:

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

    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} 来定义作为反应器一部分的依赖项的版本。

    【讨论】:

    • 感谢您给我答案,但在这里我需要构建独立模块,但该模块依赖于具有特定版本但我指定该版本的其他模块 jar/zip/war 文件在我的模块 POM 中,例如4.0.0-00007 然后它将相同的版本传递给父 POM 并失败,因为父 POM 没有该版本。 .
    • 我与您在上面描述的 maven -project 具有相同的结构,我从 Jenkins 运行它并使用我提到的版本生成 Jenkins 内部版本号,例如4.0.0-34,它将相同的值传递给所有子 POM 文件。当我运行它时,它将这个值传递给子模块,这会更改依赖模块的版本并且作业失败,因为公共模块没有那个构建在神器中。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2019-06-25
    • 2017-02-22
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多