【问题标题】:Eclipse maven compiler not supporting compiler-plugin compilerArgsEclipse maven 编译器不支持编译器插件 compilerArgs
【发布时间】:2019-09-18 21:44:36
【问题描述】:

我们有一组 Java 模块项目(使用 JDK11)。

我们的集成测试有一个单独的项目。该项目需要能够访问主应用程序项目以运行其测试,但我们不想将导出添加到主应用程序模块,因为它仅在我们运行测试时需要。

解决方案是在我们的集成测试项目中使用 compilerArgs 添加导出:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <release>${java.version}</release>
                <parameters>true</parameters>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <compilerArgs>
                    <arg>--add-exports</arg>
                    <arg>com.example.application/com.example.application=com.example.integration_tests</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

这适用于命令行mvn clean install。但遗憾的是它不适用于日食。 无论出于何种原因,eclipse 都会忽略这些 compilerArgs 并不断给出主应用程序类不可访问的错误。

有没有办法强制eclipse使用这些compilerArgs?或者这是 Eclipse 尚未涵盖的模块系统的某些方面?

【问题讨论】:

    标签: java eclipse maven java-module maven-compiler-plugin


    【解决方案1】:

    --add-exports 编译器参数可以手动设置为 Maven 依赖项在 .classpath 文件中通过替换

    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    

    与

    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="add-exports" value="com.example.application/com.example.application=com.example.integration_tests"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    

    不幸的是,右键单击项目并选择 Maven > 更新项目... 如果选项 会反转手动设置 从 pom.xml 更新项目配置 被选中(默认情况下)。

    请参阅:Eclipse bug 543631 - Eclipse - Maven - JPMS(如果您想拥有此功能,请在此处发表评论并投票)

    要在更新项目后恢复您的手动设置,您可以在更新项目之前将.classpath 文件替换为其版本。

    对于使用 JPMS 但访问模块内部内容的测试代码,请考虑以下替代项目:

    • 将测试代码放入src/test/java/而不是单独的项目中(访问内部表明这是一个单元测试而不是集成测试)
    • 在单独(集成)测试项目中,不要访问所需模块的内部内容
    • 不要在单独(集成)测试项目中使用 JPMS

    【讨论】:

    • 手动方式似乎只适用于 JRE 中的模块。在这种情况下,它是我自己制作的另一个模块。依赖项的特定“模块化”是不可修改的,并且在 JRE 系统库或通用 maven 依赖项的添加导出对话框中找不到该模块。不过感谢 Eclipse 错误链接。希望这会得到解决。
    • @SvenT23 编辑.classpath 文件对我有用(请参阅我编辑的答案)。如果您希望解决此功能请求,则不应将其称为 错误 或说您非常沮丧。作为一名开源开发人员,您宁愿花时间让快乐的人更快乐,也不愿让沮丧的人不那么沮丧。您还应该通过创建一个示例来重现问题并花一些时间查看代码(并可能提出解决方案)来表明它对您很重要。我向 Eclipse 报告的大约 80 个错误中有三分之二已经通过这种方式修复。
    • 我说看到错误非常令人沮丧,因为这就是 eclipse 所显示的,一个错误。不过,您可能对沮丧的部分是正确的,请记住它。
    【解决方案2】:

    &lt;compilerArgs&gt; 元素需要 &lt;fork&gt;true&lt;/fork&gt;,而问题中的 Maven pom 摘录中缺少该 &lt;fork&gt;true&lt;/fork&gt;。请参阅maven-compiler-plugin documentation。

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2021-08-31
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多