我正在使用 JDK 22:
openjdk version "22" 2024-03-19
OpenJDK Runtime Environment (build 22+36-2370)
OpenJDK 64-Bit Server VM (build 22+36-2370, mixed mode, sharing)
我还在使用带有 JDK 22 更新的 Eclipse 2024-03:
Version: 2024-03 (4.31.0) Build id: 20240307-1437
Eclipse JDT (Java Development Tools) Patch with Java 22 support for 2024-03 development stream
1.2.300.v20240320-0518_BETA_JAVA22
最后,我使用 Maven:
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
Maven home: C:\Maven
Java version: 22, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-22
Default locale: en_CA, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
我在 Eclipse 中创建了一个简单的 Maven 项目,其中包含通常的文件夹层次结构、一个简单的主类和一个简单的测试。
public class Main {
public static void main(final String[] args) {
final Main main = new Main();
final JavacTool jt = main.getCompiler();
System.out.println(jt);
}
public JavacTool getCompiler() {
return JavacTool.create();
}
}
正确设置 Eclipse 项目和运行配置后,我可以编译并运行主类和测试并获得预期结果。
我创建了一个 pom.xml 文件来使用 Maven 编译和安装我的代码:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>22</source>
<target>22</target>
<fork>true</fork>
<compilerArgs>
<arg>
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>
-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>
-J--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
尽管阅读了很多文章here、here、here和there(等等)并使用--add-exports和--add-opens设置编译器(我也尝试过设置 .mvn/jvm.config。),我可以编译代码,但测试总是失败并出现错误:
TestMain.test:12 » IllegalAccess class net.ptidej.tutorial.javactool.Main (in unnamed module @0x7f690630) cannot access class com.sun.tools.javac.api.JavacTool (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.api to unnamed module @0x7f690630
我怎样才能让 Maven “看到”(或“使用”?)参数 --add-exports 和 --add-opens?
@howlger指出了这个问题的答案。谢谢!无论 Maven 文档和其他帖子怎么说,compilerArgs 仅用于编译器,不会传递给 Surefire 插件的 JVM。
来自:
<fork>true</fork>
<compilerArgs>
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
</compilerArgs>
它必须变成:
<compilerArgs>
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
</compilerArgs>
与:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<argLine>
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</argLine>
</configuration>
</plugin>