无法使用IntelliJ IDEA 2017.2.1中的--patch module编译Java 9模块
我试图熟悉Java9模块以及如何在IntelliJ中定义它们。除此之外,我想使用无法使用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
--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
withmodule 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我想修补一个模块?哎呀,我没看到。好吧,那我就猜不出来了