2017-08-07 181 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声明? –