Подтвердить что ты не робот

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

4b9b3361

Ответ 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