上下文:
问题是关于使用 maven 构建的多模块(maven,而不是 Java 9 模块)Java 项目,其中一个模块依赖于另一个模块的 jar。
模块概述和一些上下文:
- A:编译为 jar 的库。
- B:客户端应用程序,依赖于A的jar;编译为可执行 jar。
- C:服务器应用程序,既不依赖于A也不依赖于B;编译为可执行 jar。
- 我只能使用 Java 8,因此无法使用 Java 9 模块。
- 使用的 IDE 是 IntelliJ IDEA Ultimate。
什么有效:
- 使用
mvn clean package
将模块构建为三个独立的 jar(在 B 和 C 情况下可执行)。 - 将模块A中的包导入到模块B的类中(不是我想要的)。
- 将对模块A的依赖添加到B的pom.xml中(我不知道这会产生什么影响......)。
我想要实现的目标:
- 我想将对从模块 A 构建的 jar 的依赖项添加到模块 B 的 pom.xml 中。
- 我想从模块 A 的 jar 中导入模块 B 的类中的公共(public)类和接口(interface)(通过将其添加为 pom.xml 中的依赖项)并且无需手动复制 jar)。 -> B 的开发和调试应仅依赖于 A 的最后一个稳定版本,并且不应因库 A 上的同步开发而中断强>.
- 整个构建过程应通过执行一个 Bash 脚本(一次)来完成。
- 构建项目应按顺序执行以下步骤:
- 将模块A构建为jar(如果不可避免,也构建B)。
- 使用第 1 步中生成的 jar 将模块B构建(或重建)为可执行 jar。
- 在构建过程中随时构建模块C。
是否有使用 Maven 的优雅解决方案来执行此操作?
最佳答案
自 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>
您还应该能够使用 mvn clean package -pl module-A
独立构建项目,尽管我建议您至少同时构建 A 和 B。
关于Java 与 Maven : How to make Module B depend on jar of module A?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247406/