Java 与 Maven : How to make Module B depend on jar of module A?

标签 java maven intellij-idea jar dependencies

上下文:

问题是关于使用 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(在 BC 情况下可执行)。
  • 将模块A中的包导入到模块B的类中(不是我想要的)。
  • 将对模块A的依赖添加到B的pom.xml中(我不知道这会产生什么影响......)。

我想要实现的目标:

  • 我想将对从模块 A 构建的 jar 的依赖项添加到模块 B 的 pom.xml 中。
  • 我想从模块 A 的 jar 中导入模块 B 的类中的公共(public)类和接口(interface)(通过将其添加为 pom.xml 中的依赖项)并且无需手动复制 jar)。 -> B 的开发和调试应仅依赖于 A 的最后一个稳定版本,并且不应因库 A 上的同步开发而中断强>.
  • 整个构建过程应通过执行一个 Bash 脚本(一次)来完成。
  • 构建项目应按顺序执行以下步骤:
    1. 将模块A构建为jar(如果不可避免,也构建B)。
    2. 使用第 1 步中生成的 jar 将模块B构建(或重建)为可执行 jar。
    3. 在构建过程中随时构建模块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/

相关文章:

java - Google App Engine 开发服务器给出错误 500 (IntelliJ IDEA)

intellij-idea - 开发和测试 Kubernetes API 扩展

java - 在循环中创建复杂对象并在循环中调用方法会导致stackOverflow异常吗?

windows - 使用digest.bat 创建摘要并退出且未配置JRE_HOME

java - 在 Maven Central 中搜索扩展给定类的类

maven - 找不到HttpSession类

java - 如何阻止 JTextField 和 JTextLabel 在 JPanel 上截断

java - 为什么 Maven 会警告我有关编码的问题?

java - 新的缺失/不满足的依赖项 : service jboss. module.spec.service

Spring Boot - DevTools - RestController 在重建项目时并不总是映射