上下文:
问题是关于一个使用maven进行构建的多模块(maven,而不是Java 9模块)Java项目,其中一个模块取决于另一个模块的jar。
模块概述和一些上下文:
有效的方法:
mvn clean package
将模块构建到三个单独的jar中(对于 B 和 C 可以执行)。我想要实现的目标:
是否有使用maven的优雅解决方案?
答案 0 :(得分:2)
自Maven 3.5.0-beta起,有一个revision
字段用于管理多模块项目。
https://maven.apache.org/maven-ci-friendly.html
您基本上需要父母pom.xml
看起来像
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
</project>
然后您的子模块A(子级)看起来像
<project>
<modelVersion>...</modelVersion>
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<!-- Make sure you have maven 3.6.0 at least for this to work -->
<version>${revision}</version>
</parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<!-- Don't put version, it's taken from the parent -->
...
</project>
最后,您的模块B看起来像这样
<project>
<modelVersion>...</modelVersion>
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${revision}</version>
</parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
...
<dependency>
<groupId>...</groupId>
<artifactId>module-A</artifactId>
<version>${project.version}</version>
</dependency>
...
</project>
您的模块C很可能看起来像模块A,但没有依赖性
这应该使您的pom在本地工作。如果需要部署这些插件,则还需要添加一个flatten
插件,该插件将使用pom.xml
并将变量revision
替换为项目的实际版本。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
即使我建议您至少同时构建A和B,您也应该能够使用mvn clean package -pl module-A
独立构建项目。
答案 1 :(得分:1)
在Maven中,通常有两种选择:
在任何一种情况下,您都可以通过在pom.xml
中使用Maven依赖关系来描述依赖关系。
多模块项目通常是一次性构建的,因此编译所有代码并为所有三个模块使用相同的版本号。这将违反您的“根据最新的稳定版本进行构建”的想法,因为在构建时,您始终依赖于最新版本的A。
如果定义了三个不同的项目,则没有这些限制(并且C似乎还是独立的)。仍然存在两个问题:您需要更新依赖项中A的版本-可以使用版本插件来完成。您想要构建“一键构建”。最简单的方法可能是Jenkins(或任何构建服务器)中的管道,但是您也可以编写一个调用Maven三次的Shell脚本。