Я пытаюсь познакомиться с модулями Java 9 и как их определить в IntelliJ. Помимо прочего, я хочу решить проблему с разделенным пакетом, используя --patch-module compiler/JVM, и я не знаю, как заставить его работать в IntelliJ.
Я использую IntelliJ IDEA 2017.2.1 Build #IC 172.3544.35 с 64-разрядной виртуальной машиной Java HotSpot TM (сборка 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 флаг --patch-module в IntelliJ, используя Settings > Build,Execution,Deplyoment => Compiler => Shared build process VM options как описано здесь.
Компиляция не удалась, потому что компилятор не смог найти суперкласс RegularImmutableList из библиотеки RegularImmutableList.
Рекомендации, представленные IntelliJ является добавление requires директив для библиотеки гуавы на дескриптор модуля, который, конечно, не работает, потому что компилятор тогда справедливо жалуется на проблеме раскола пакета:
Ошибка: java: модуль guava считывает пакет com.google.common.collect как из com.effjava.collect, так и из guava
В ходе дальнейшего расследования я заметил, что процесс сборки --patch-module предупреждение, связанное с --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 должен исправлять мой модуль?

