не может скомпилировать модуль Java 9 с --patch-модулем в IntelliJ IDEA 2017.2.1
Я пытаюсь познакомиться с модулями 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 должен исправлять мой модуль?
Ответы
Ответ 1
Ну, в конце концов, со следующей конфигурацией IntelliJ (Исправлена версия IDEA-169150) -
IntelliJ IDEA 2018.1 (Community Edition)
Build #IC-181.4203.550, built on March 27, 2018
JRE: 1.8.0_152-release-1136-b20 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.13.3
и параметры компилятора Java для проекта, как показано на следующем скриншоте:
![Java compiler configuration]()
- Переопределить параметры компилятора для каждого модуля
- Выберите модуль
-
Добавьте параметр компиляции для исправления (примечание - я использовал последнюю версию фляги)
--patch-module com.effjava.collect=/Users/naman.nigam/.m2/repository/com/google/guava/guava/24.1-jre/guava-24.1-jre.jar
RegularImmutableList
MyImmutableList
Build> Build Project, и сборка завершится успешно (хотя я все еще вижу RegularImmutableList
в MyImmutableList
как красный) для меня.
![enter image description here]()