构建面向Java 9和更早版本的模块化Java应用程序
我的应用程序在Java 8及更早版本中运行良好,但无法加载不属于Java SE的类,并且在以下情况下失败:构建面向Java 9和更早版本的模块化Java应用程序,java,java-platform-module-system,Java,Java Platform Module System,我的应用程序在Java 8及更早版本中运行良好,但无法加载不属于Java SE的类,并且在以下情况下失败: class MyClass (in unnamed module @0x4d14b6c2) cannot access class sun.tools.attach.HotSpotVirtualMachine (in module jdk.attach) because module jdk.attach does not export sun.tools.attach to unna
class MyClass (in unnamed module @0x4d14b6c2) cannot access class
sun.tools.attach.HotSpotVirtualMachine (in module jdk.attach) because
module jdk.attach does not export sun.tools.attach to unnamed module
@0x4d14b6c2.
我最初的想法是模块化我的应用程序,并确定我需要的类是否有一个公共模块来正确声明依赖关系。然而,当我宣布dummymodule info.java
,javac
开始抱怨:
modules are not supported in -source 1.6; use -source 9 or higher to enable modules
编辑:我正在指示maven编译器插件生成与java 6兼容的字节码,因为我需要应用程序来支持它。实际使用的参数是-g-nowarn-target 1.6-source 1.6-encoding UTF-8
也许我遗漏了一些明显的东西,但是我如何构建一个可以与Jigsaw以及没有它的旧java版本一起工作的jar呢?在Jigsaw开发邮件列表的帮助下,我成功地构建了模块化的代码库。(我最终不再需要HotSpotVirtualMachine了)
- 使用
编译-source 9-target 9
,使应用程序能够在较旧的JVM上运行,因为这些JVM没有理由加载该类module info.class
- 其余的类应该使用适当的源/目标级别进行编译(Java9在这里没有任何更改)
javac
调用:默认情况下,只编译类,跳过模块描述符,如果使用java9编译,则编译模块描述符时跳过所有常规类
Maven pom.xml声明以保持应用程序在不同JDK版本之间的可构建和可运行性有点笨拙,但仍然有效:
<!--
When using compiler from java 8 and older, ignore module files altogether.
Otherwise, use 2 phase compilation to build
- all classes for target version and
- module-info.java with 9+ source and target level
-->
<profiles>
<profile>
<id>jigsaw</id>
<activation>
<jdk>[1.9,)</jdk>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
</configuration>
<executions>
<execution>
<id>module-infos</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>**/module-info.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<excludes>
<exclude>**/module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
拼图
[1.9,)
org.apache.maven.plugins
maven编译器插件
3.5.1
1.9
1.9
模块信息
编译
编译
**/module-info.java
org.apache.maven.plugins
maven编译器插件
3.5.1
1.6
1.6
默认编译
**/module-info.java
答案是错误的:使用-source 9或更高版本
尽管您的问题需要更详细的信息才能正确回答:您使用什么命令来构建它,您使用什么命令来运行它…您正试图针对不支持您所需内容的旧JVM进行构建。请使用-source 9
作为错误提示我已经更新了这个问题。我正在调整代码以支持Java9,而不会放弃对旧java版本的支持。