2017-08-07 36 views
4

我已經實踐了與Maven項目的Java 9模塊系統集成。它似乎工作得很好,但我擔心在java 9之前編譯的maven模塊的向後兼容性。當Java 9模塊系統集成到Maven中時,如何處理自動模塊

爲了向後兼容,JPMS(Java平臺模塊系統)具有自動模塊概念。在JPMS中,沒有module-info.java的Jar文件被認爲是Automatic Module,其他的Java模塊可以使用這個jar文件作爲模塊名。

在與maven項目集成的情況下,我認爲需要額外支持JPMS向後兼容性。首先,基本的jar文件和maven jar文件結構不一樣。其次,maven jar文件的命名與規則不兼容,可以兼容JPMS模塊的命名規則。看下面的例子。

<artifactId>previous-version-module</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

在上述情況下,我們已經使用了先前版本的模塊-0.0.1-SNAPSHOT並希望在新的Java 9 Maven項目使用這個模塊。

module new.module{ 
    requires previous-version-module-0.0.1-SNAPSHOT 
} 

但它發生編譯錯誤或IDEA工具拋出錯誤。

我想知道如何在java 9和maven集成項目中使用java 9之前編譯的maven jar文件。 我搜索了一些額外的模塊定義規則或maven插件,我找不到任何解決方案。

謝謝。

+0

你怎麼沒有在Maven集成?我建議阻止使用自動模塊...更好地添加一個module-info.java文件並正確命名您的模塊....在module-info.java中的用法從不包含版本....此外,你是什麼意思是「maven jar文件它不一樣的結構」?你在談論jmod文件嗎?請參閱https://github.com/khmarbaise/jdk9-jlink-jmod-example/tree/master/maven-example – khmarbaise

+0

「maven jar文件它不是相同的結構」意味着jar文件(在maven上編譯)包括META-INFO目錄爲maven依賴。 –

回答

6

如果模塊名稱不明顯,則可以使用jar --file=<jarfile> --describe-module來查看派生名稱。或者,使用--list-modules選項,即java -p <jarfile> --list-modules

一旦你知道模塊名稱,那麼你使用requires <module>它應該工作。在構建源代碼樹中具有module-info.java的項目時,maven-compiler-plugin會將所有依賴關係放在模塊路徑上。

+0

感謝您的回答。 –

+1

我會盡力回答您的問題。 是否有任何支持描述模塊名稱功能的pom.xml聲明? –