【问题标题】:cannot compile Java 9 module with --patch-module in IntelliJ IDEA 2017.2.1无法在 IntelliJ IDEA 2017.2.1 中使用 --patch-module 编译 Java 9 模块
【发布时间】:2018-01-14 16:32:50
【问题描述】:

我正在尝试熟悉 Java 9 模块以及如何在 IntelliJ 中定义它们。除其他事项外,我想使用--patch-module 编译器/JVM 标志解决拆分包问题,但我不知道如何使其在 IntelliJ 中工作。

我正在使用 IntelliJ IDEA 2017.2.1 Build #IC 172.3544.35 和 Java HotSpot(TM) 64 位服务器 VM(构建 9+180,混合模式)。

这是我的源文件MyImmutableList.java:

package com.google.common.collect;

public class MyImmutableList extends RegularImmutableList {
  public MyImmutableList(Object[] array) {
    super(array);     
  }
}

它属于我的模块com.effjava.collect 和module-info.java:

module com.effjava.collect {
    // do not require module guava; instead patch this module with guava.19-0.jar via:
    // javac --patch-module com.effjava.collect=guava-19.0.jar module-info.java com/google/common/collect/MyImmutableList.java
    //    requires guava;        
    exports com.google.common.collect;
}

为了编译我的模块,我在 IntelliJ 中指定了 --patch-module 标志,使用 Settings => Build,Execution,Deplyoment => Compiler => Shared build process VM options 为 described here。

编译失败,因为编译器无法从番石榴库中找到超类RegularImmutableList。

IntelliJ 提供的建议是在模块描述符中为 guava 库添加 requires 指令,这当然不起作用,因为编译器会正确地抱怨拆分包问题:

错误:java:模块 guava 从 com.effjava.collect 和 guava 读取包 com.google.common.collect

在进一步调查中,我注意到构建过程发出与--patch-module 标志相关的警告:

错误:构建过程异常终止: "C:\Program Files\Java\jdk-9\bin\java" -Xmx700m -Djava.awt.headless=true

...很多东西...

警告:未知模块:com.effjava.collect 指定给 --patch-module

...更多的东西...

顺便说一句,我不知道如何获取编译器警告。我没有将它们隐藏在 IntelliJ 的消息窗口中,但我看不到它们。作为一种解决方法,我只是指定了虚假的编译器标志并让构建过程崩溃,以便它在其崩溃报告中发出警告。

无论如何,构建过程抱怨 - 在构建模块时 - 有问题的模块不存在,因此无法通过 --patch-module 修补。这个抱怨没有任何意义,因为我确实通过在命令行级别手动输入javac 和jarcommands 成功编译和构建了我的模块:

cd %PROJECTDIR%\com.effjava.collect\src
javac --patch-module com.effjava.collect=../../guava/guava-19.0.jar -d ../../out/production/com.effjava.collect module-info.java com/google/common/collect/MyImmutableList.java
jar --create --file=../../out/artifacts/com_effjava_collect_jar/com.effjava.collect.jar -C ../../out/production/com.effjava.collect .

如何告诉 IntelliJ 的构建过程我要修补我的模块?

【问题讨论】:

  • 我是否正确理解您正在尝试修补正在编译的模块?如果是这样,我猜这就是问题所在。
  • 为什么在编译的模块打补丁会出问题?当我手动输入javac 命令时它可以工作。事实上,我有一个批处理文件,它使用--patch-module 标志编译我的所有模块,创建所有模块化jar,并最终使用--patch-module 标志运行主模块。问题出在 IntelliJ 上。如何告诉 IntelliJ 我要修补模块?
  • 糟糕,没看到。好吧,那我猜不透了。 ;)

标签: java intellij-idea java-9 java-platform-module-system java-module


【解决方案1】:

最终使用以下 IntelliJ 的配置(Fix version of IDEA-169150) -

IntelliJ IDEA 2018.1 (Community Edition)
Build #IC-181.4203.550, built on March 27, 2018
JRE: 1.8.0_152-release-1136-b20 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.13.3

以及项目的 Java Compiler 设置如下截图所示:-

  • 覆盖每个模块的编译器参数
  • 选择模块
  • 为补丁添加编译选项(注意 - 我用的是最新版的jar)

    --patch-module com.effjava.collect=/Users/naman.nigam/.m2/repository/com/google/guava/guava/24.1-jre/guava-24.1-jre.jar
    

发布此选择 Build > Build Project 并且构建成功完成(尽管我仍然看到 MyImmutableList 中的 RegularImmutableList 为红色)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多