Я пытаюсь познакомиться с модулями 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 должен исправлять мой модуль?