Java 如何在jigsaw和jre 8支持下使用maven?
我正在用maven构建一个java项目。 我想确定几件事:Java 如何在jigsaw和jre 8支持下使用maven?,java,maven,java-8,java-9,java-platform-module-system,Java,Maven,Java 8,Java 9,Java Platform Module System,我正在用maven构建一个java项目。 我想确定几件事: 构建的jar可以在jre8上运行 构建的jar可以在jre9上运行,带有module/jigsaw 构建的jar可以放在maven central上 我应该如何配置maven编译器插件? 谢谢 原始回购协议位于 现在我可以通过2和3,但是输出jar似乎不能在jre8上运行。A可以用来实现这个目的;但是,如果您只需要Jigsaw模块支持,那么使用maven编译器插件的Java 8和9的双重编译配置就足够了(如下所示) 以下是一个构建配置,
maven编译器插件的Java 8和9的双重编译配置就足够了(如下所示)
以下是一个构建配置,它能够维护JRE 8支持,但与在JRE 9+中用作模块兼容。如有必要,可以对其进行调整,以支持最早可追溯到JRE 1.6的项目
以下生成配置概述:
- 强制执行
$JAVA_HOME
JDK 9+,以便可以根据源代码编译和验证module info.JAVA
(确保正确引用所有模块依赖项)
- 将
默认编译
执行更改为NO-OP。通过指定8
(或目标
/源
标志),Maven自动导入期间的某些IDE(使用IntelliJ测试)将假定此项目的语言级别为Java 8,并产生有关项目模块信息.Java
的错误
- 为Java9编译所有源代码(包括
module info.java
);这确保模块info.java
包含在没有项目源的情况下使用的任何依赖项
- 编译java 8的所有源代码(不包括
module info.java
),用java 8类覆盖以前编译的所有java 9类;这意味着只有Java 9类(类级别53+)是module info.class
。所有其他类现在都应该可以在兼容的JRE 8上执行
注释:
- 需要注意的是,这将编译两次源代码,一次用于Java8,另一次用于Java9。这可能会显著增加大型项目的构建时间(但对于小型项目则可以忽略不计)。这可以通过将
module info.java
放在另一个源目录(例如src/main/java9
)中并配置多版本JAR来解决(请参阅本消息开头的第一个链接)。请注意,为了正确导入IDE并正确标记这个额外的Java9源目录,可以使用带有org.codehaus.mojo:buildhelperMaven插件的NO-OP执行
- 只有
module info.java
将支持java 9,所有其他类仅限于JDK/JRE 8中可用的类/方法/字段/代码
- 如果项目配置中的某些工具不支持Java 9
module info.class
,则可能需要在其中进行更新。一些旧版本的默认Maven插件没有足够的模块支持
org.apache.maven.plugins
maven enforcer插件
3.0.0-M3
jdk9
执行
[1.9,)
编译需要JDK 9+
org.apache.maven.plugins
maven编译器插件
3.8.1
默认编译
没有一个
9
java-9-module-compile
编译
9
java-8-compile
编译
8.
module-info.java
我已经完成了。请看我的项目。您使用Java 9编译器级别编译,然后使用Java 8编译级别重新编译除module-info.Java之外的所有内容。因此,您有一个带有Java 9模块信息的Java 8 jar。您可以在GitHub上的ant xml脚本中看到编译命令
Android studio最初的一个问题已经解决,它不会忽略模块信息。最近的Android studio版本可以,所有Java平台和环境也可以。Java 9 JRE和更高版本会识别模块信息,Java 8不会,Java 8和更早版本会忽略模块信息
我的jar也在maven central中,因此它可以满足您的3个需求。请在您的开发环境中使用Java 8或更高版本的JRE进行测试
多释放罐不是必需的,也不值得麻烦
当我在研究同一个问题时,我发现这个解决方案在Apache项目中使用,所以我不是唯一一个这样做的人。听起来这么广泛,你可能想在maven中寻找工具链,在maven中寻找多版本jar。(在Java-8上运行jar有什么问题?@Naman异常在线程“main”中)java.lang.UnsupportedClassVersionError:com/xenoamess/cyan_potion/SDL_GameControllerDB_Util已由java运行时的最新版本(类文件版本53.0)编译,该版本仅适用于java运行时
<build>
<plugins>
<!-- ensure the project is compiling with JDK 9+ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>enforce-jdk9</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireJavaVersion>
<version>[1.9,)</version>
<message>JDK 9+ is required for compilation</message>
</requireJavaVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<!-- compile sources -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<!-- disable default phase due to fixed id and position in lifecycle -->
<execution>
<id>default-compile</id>
<phase>none</phase>
<!-- specify source/target for IDE integration -->
<configuration>
<release>9</release>
</configuration>
</execution>
<!-- compile sources with Java 9 to generate and validate module-info.java -->
<execution>
<id>java-9-module-compile</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<release>9</release>
</configuration>
</execution>
<!-- recompile sources as Java 8 to overwrite Java 9 class files, except module-info.java -->
<execution>
<id>java-8-compile</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<!-- specify JDK 9+ release flag to ensure no classes/methods later than Java 8 are used accidentally -->
<release>8</release>
<!-- exclude module-info.java from the compilation, as it is unsupported by Java 8 -->
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>