无法从模块 jdk.compiler 导出/打开包以在 Maven 中运行/通过测试

问题描述 投票:0回答:1

设置

我正在使用 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>

尽管阅读了很多文章herehereherethere(等等)并使用--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

eclipse maven-3 java-platform-module-system java-compiler-api java-20
1个回答
0
投票

@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>
© www.soinside.com 2019 - 2024. All rights reserved.