簡體   English   中英

Java與Maven:如何使模塊B依賴於模塊A的jar?

[英]Java with Maven: How to make Module B depend on jar of module A?

語境:

問題是關於一個使用maven進行構建的多模塊(maven,而不是Java 9模塊)Java項目,其中一個模塊取決於另一個模塊的jar。

模塊概述和一些上下文:

  • 答:將庫編譯為jar。
  • B:一個客戶端應用程序,取決於A的 jar; 編譯為可執行jar。
  • C:服務器應用程序,不依賴於AB 編譯為可執行jar。
  • 我只能使用Java 8,因此不能使用Java 9模塊。
  • 使用的IDE是IntelliJ IDEA Ultimate。

什么有效:

  • 使用mvn clean package將模塊構建到三個單獨的jar中(對於BC可執行)。
  • 將包從模塊A導入到模塊B的類中( 不是我想要的 )。
  • 將模塊A的依賴項添加到B的pom.xml中(我不知道這有什么作用...)。

我想實現的目標:

  • 我想向模塊Ajar添加依賴項到模塊B的pom.xml。
  • 我想從模塊B的類中的模塊A的jar中導入公共類和接口(通過將其作為依賴項添加到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>

即使我建議您至少同時構建A和B,您也應該能夠使用mvn clean package -pl module-A獨立構建項目。

在Maven中,通常有兩個選擇:

  1. 定義三個項目A,B和C。
  2. 定義一個包含A,B和C作為模塊的多模塊項目。

無論哪種情況,都可以通過使用pom.xml Maven依賴關系來描述依賴關系。

多模塊項目通常是一次性構建的,因此編譯所有代碼,並對所有三個模塊使用相同的版本號。 這將違反您的“根據最新的穩定版本進行構建”的想法,因為在構建時始終依賴於最新版本的A。

如果您定義了三個不同的項目,則沒有這些限制(並且C似乎還是獨立的)。 仍然存在兩個問題:您需要更新依賴項中A的版本-可以使用版本插件來完成。 您想要構建“一鍵構建”。 最簡單的方法可能是Jenkins(或任何構建服務器)中的管道,但是您也可以編寫一個調用Maven三次的Shell腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM