java intellij-idea java-9 jigsaw java-module

no se puede compilar el módulo Java 9 con--patch-module en IntelliJ IDEA 2017.2.1



intellij-idea java-9 (1)

Estoy tratando de familiarizarme con los módulos de Java 9 y cómo definirlos en IntelliJ. Entre otras cosas, quiero resolver un problema de paquete dividido utilizando el --patch-module JVM y no sé cómo hacer que funcione en IntelliJ.

Estoy utilizando IntelliJ IDEA 2017.2.1 Build #IC 172.3544.35 con Java HotSpot (TM) VM de servidor de 64 bits (build 9 + 180, modo mixto).

Este es mi archivo fuente MyImmutableList.java :

package com.google.common.collect; public class MyImmutableList extends RegularImmutableList { public MyImmutableList(Object[] array) { super(array); } }

Pertenece a mi módulo com.effjava.collect con 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; }

Para la compilación de mis módulos, especifiqué la --patch-module en IntelliJ usando Settings => Build,Execution,Deplyoment => Compiler => Shared build process VM options como se describe aquí .

La compilación falla porque el compilador no puede encontrar la superclase RegularImmutableList de la biblioteca de guayabas.

El consejo proporcionado por IntelliJ es agregar una directiva de requires para la biblioteca de guayaba al descriptor del módulo, que por supuesto no funciona porque el compilador se queja con razón del problema del paquete dividido:

Error: java: el módulo guava lee el paquete com.google.common.collect desde com.effjava.collect y guava

En una investigación más a fondo, noté que el proceso de compilación emite una advertencia relacionada con el --patch-module que dice:

Error: finalización anormal del proceso de compilación: "C: / Archivos de programa / Java / jdk-9 / bin / java" -Xmx700m -Djava.awt.headless = true

... un montón de cosas ...

ADVERTENCIA: módulo desconocido: com.effjava.collect especificado para --patch-module

... mas cosas ...

Por cierto, no sabía cómo conseguir las advertencias del compilador. No los oculto en la ventana de mensajes de IntelliJ y, sin embargo, no puedo verlos. Como solución alternativa, simplemente especifiqué los indicadores de compilador falsos y dejé que el proceso de compilación se bloquee para que emitiera el AVISO en su informe de fallo.

De todos modos, el proceso de compilación se queja, mientras se construye el módulo, de que el módulo en cuestión no existe y por esta razón no se puede --patch-module través de --patch-module . Esta queja no tiene sentido porque compilé y construí exitosamente mi módulo escribiendo los comandos javac y jar manualmente en el nivel de línea de comando:

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 .

¿Cómo puedo decirle al proceso de compilación de IntelliJ que quiero parchear mi módulo?


Bueno, eventualmente con la siguiente configuración de IntelliJ (versión de la revisión de 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

y la configuración del compilador de Java para el proyecto como la que se muestra en la siguiente captura de pantalla:

  • Anular parámetros de compilador por módulo
  • Seleccione el modulo
  • Agregue la opción de compilación al parche ( Nota : he usado la última versión del jar)

    --patch-module com.effjava.collect=/Users/naman.nigam/.m2/repository/com/google/guava/guava/24.1-jre/guava-24.1-jre.jar

Publique esta selección Construir> Proyecto de compilación y la compilación se completa correctamente (aunque sigo viendo RegularImmutableList en MyImmutableList en rojo) para mí.