我正在尝试熟悉 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;
}
为了编译我的模块,我使用=> => =>--patch-module
在 IntelliJ 中指定了标志,如此处所述。Settings
Build,Execution,Deplyoment
Compiler
Shared build process VM options
编译失败,因为编译器无法RegularImmutableList
从 guava 库中找到超类。
IntelliJ 提供的建议是将requires
guava 库的指令添加到模块描述符中,这当然不起作用,因为编译器随后正确地抱怨了拆分包问题:
错误: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
和命令成功地编译和构建了我的模块: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 的构建过程我想要修补我的模块?