我有一个多模块的maven项目,例如
ABCDE目前,该项目运行良好,只有一项工作来构建所有模块并上传到artifactory,例如4.0.0-的某个版本。他们正在使用Jenkins作业中的版本:set-DnewVersion=4.0.0-${build_NUMBER}。现在我的下一个任务是将这个项目拆分为模块,这样他们的开发团队就可以独立地构建每个模块,但我的问题是一些模块依赖于其他模块,例如
模块B依赖于模块A和模块C。如果我首先构建模块A,然后它生成编号4.0.0-00001并将其上传到artifactory,然后我构建模块C,然后它产生版本4.0.0-00005。现在问题来了,我如何构建依赖于模块B和模块C的模块B。在我看来,我需要定义模块A和C的版本在依赖项部分中显式显示。
<dependency>
<groupId>com.xyz.engine</groupId>
<artifactId>A</artifactId>
<version>4.0.0-00005</version>
</dependency>
在我的模块POM中,我打电话给我的父母POM,在詹金斯的工作中,我正在给予版本:set-DnewVersion=4.0.0-${BUILD_NUMBER}用于版本控制。如果我明确定义了模块的版本,那么它也会将相同的值传递给父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>
它为我分配给Common模块的Parent POM取了相同的值。我将Parent POM保存在单独的存储库中,它不应该取相同的值,它应该只取我为Parent PO姆定义的值,并且它应该从他们那里下载它,并将所有值提供给模块POM,并且应该为不同版本的模块LicenseVerifier创建构建。
如果您有一个多模块构建,它看起来像这样:
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
其中选项CCD_ 2表示CCD_。如果开发人员需要一个特定的状态,您可以先使用mvn install
,然后只构建您想要构建的模块。
与多模块构建相关的一件非常重要的事情是,所有模块和父模块都要有相同的版本。因此,这些模块之间的依赖关系是没有问题的。
从Maven 3.2.1开始,您可以通过属性定义版本。
防止Maven发出有关版本的警告的简单更改具有属性表达式。版本中允许的属性表达式包括${revision}、${changelist}和${sha1}。这些属性可以在外部设置,但最终将在Maven中创建一个机制其中可以以标准方式注入这些特性。例如您可能需要收集当前Git修订版并注入该值转换为${sha1}。这绝不是连续交付,但这是朝着正确方向迈出的一步。
此外,在开发过程中,我更喜欢SNAPSHOT版本,因为它在存储库管理器中的清理更简单。所以从本质上讲,我不需要把逻辑上属于一起的模块分开。
除此之外,如果在多模块构建中使用相同的版本,则可以使用以下内容:${project.version}
来定义作为reactor一部分的依赖项的版本。