无法使用IntelliJ IDEA 2017.2.1中的--patch module编译Java 9模块

无法使用IntelliJ IDEA 2017.2.1中的--patch module编译Java 9模块,java,intellij-idea,java-9,java-platform-module-system,java-module,Java,Intellij Idea,Java 9,Java Platform Module System,Java Module,我试图熟悉Java9模块以及如何在IntelliJ中定义它们。除此之外,我想使用--patch module编译器/JVM标志来解决一个拆分包的问题,但我不知道如何使它在IntelliJ中工作 我正在使用IntelliJ IDEA 2017.2.1版本#IC 172.3544.35和Java HotSpot(TM)64位服务器虚拟机(版本9+180,混合模式) 这是我的源文件MyImmutableList.java: package com.google.common.collect; pub

我试图熟悉Java9模块以及如何在IntelliJ中定义它们。除此之外,我想使用
--patch module
编译器/JVM标志来解决一个拆分包的问题,但我不知道如何使它在IntelliJ中工作

我正在使用IntelliJ IDEA 2017.2.1版本#IC 172.3544.35和Java HotSpot(TM)64位服务器虚拟机(版本9+180,混合模式)

这是我的源文件
MyImmutableList.java

package com.google.common.collect;

public class MyImmutableList extends RegularImmutableList {
  public MyImmutableList(Object[] array) {
    super(array);     
  }
}
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;
}
它属于我的模块
com.effjava.collect
with
module info.java

package com.google.common.collect;

public class MyImmutableList extends RegularImmutableList {
  public MyImmutableList(Object[] array) {
    super(array);     
  }
}
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中使用
设置
=>
构建、执行、deployment
=>
编译器
=>
共享构建过程VM选项
指定了
--patch module
标志

编译失败,因为编译器无法从guava库中找到超类
regulammutablelist

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

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

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

错误:异常生成进程终止: “C:\ProgramFiles\Java\jdk-9\bin\Java”-Xmx700m-Djava.awt.headless=true

。。。很多东西

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

。。。更多的东西

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

无论如何,在构建模块时,构建过程会抱怨相关模块不存在,因此无法通过
--patch module
进行修补。这一抱怨毫无意义,因为我确实通过在命令行级别手动输入
javac
jar
命令成功编译和构建了我的模块:

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的构建过程我想修补我的模块?

好的,最终IntelliJ的配置如下

以及项目的Java编译器设置,如以下屏幕截图所示:-

  • 重写每个模块的编译器参数
  • 选择模块
  • 将编译选项添加到补丁(注意-我使用了jar的最新版本)


发布此选择Build>Build项目,构建成功(尽管我仍然在
MyImmutableList
中看到
RegularImmutableList
为红色)


我是否正确理解您试图修补正在编译的模块?如果是这样的话,我想这就是问题所在。为什么要修补编译中的模块会有问题?当我手动输入
javac
命令时,它会工作。事实上,我有一个批处理文件,它用
--patch module
标志编译所有模块,创建所有模块JAR,并最终用
--patch module
标志运行主模块。问题在于IntelliJ。我怎样才能告诉IntelliJ我想修补一个模块?哎呀,我没看到。好吧,那我就猜不出来了