jdeps falla con Java y JavaFX 11 en el tarro de grasa

cfsoe:

Estoy tratando de utilizar jdeps (y) JLINK para el despliegue de mi aplicación Java 11 que está utilizando JavaFX 11. Todo bien funciona corriendo dentro de mi IDE Java. Pero cuando se utiliza JdeP me sale el siguiente error, que indica que algún módulo o paquete no se pueden encontrar. Estoy atascado. Gracias por tu ayuda.

jdeps --list-DEP-/Users/.../target:/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/jmods:/Users/.../javafx-sdk-11.0 --module camino. 2 / lib --add-módulos chaincoder, javafx.fxml, javafx.base, javafx.controls, javafx.graphics, javafx.web /Users/.../target/chaincoder4-1.0.jar

Error: Module javafx.media contains package javafx.collections, module javafx.base exports package javafx.collections to javafx.media

module-info.java es

chaincoder módulo {

requires   javafx.web;
requires   javafx.graphics;
requires   javafx.controls;
requires   javafx.fxml;
requires   javafx.base;
requires   javafx.media;

requires java.desktop;
requires java.base;
requires java.xml;
requires java.logging;

requires jdk.jsobject;

exports   core;

}

pom.xml es

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>11.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>11.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>11.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>11.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11.0.2</version>
        </dependency>


<build>
    <plugins>

        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>core.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeScope>system</excludeScope>
                        <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <compilerArguments>
                    <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
                </compilerArguments>
            </configuration>
        </plugin> 
    </plugins>

</build>
José Pereda :

Ninguna razón por la que está utilizando el maven-dependency-pluginplugin?

Si ve lo que el unpack-dependenciesobjetivo es hacer, notará que los target/classescarpetas contiene más de 90 MB de clases después el plugin extrae todas las dependencias del proyecto, incluyendo los JavaFX, y une a todas.

Y adivinar lo que sucede con los diferentes module-info.classarchivos para cada uno de los diferentes módulos de JavaFX? Sólo se impone, en este caso el de javafx.media.

Así se ha creado un nuevo módulo en target/classes!

Se llama así javafx.media, contiene las clases de proyectos y todas las clases de JavaFX, y que incluye todo desde javafx.baseo javafx.graphics.

Si marca este target/classes/module-info.classarchivo:

module javafx.media {
    requires transitive javafx.base;
    requires transitive javafx.graphics;
    ...
}

este "módulo", que ya contiene todas las clases de JavaFX, también requerirá de nuevo esas clases de javafx.basey javafx.graphics, duplicarlos.

Esto explica su mensaje error de:

Error: Module javafx.media contains package javafx.collections, 
       module javafx.base exports package javafx.collections to javafx.media

Ahora se puede ver que su nuevo módulo javafx.mediacontiene muchos paquetes que también se exportan desde javafx.basea ella, y que viola el paquete dividido no permitido condición:

El mismo paquete Java sólo puede ser exportado por un único módulo de Java en tiempo de ejecución. En otras palabras, no se puede tener dos (o mas) módulos que exportan el mismo paquete en uso al mismo tiempo. La máquina virtual de Java se quejará en el arranque si lo hace.

Soluciones posibles

  • Tal vez usted no necesita el maven-dependency-pluginplug-in en absoluto? Y eliminar si no lo necesita.

  • Está añadiendo la targetcarpeta con todas las clases de JavaFX a la ruta_módulo:

    jdeps --list-deps --module-path /Users/…/target:...
    

Obviamente, esto es un error, ya que la classescarpeta contiene todas las clases de JavaFX y un descriptor de módulo de información equivocada. No es un módulo válido, por lo que sólo sacarlo de la ruta_módulo.

  • Entonces no es necesario añadir la ruta del JDK a la ruta_módulo, que se realiza de forma predeterminada.

Por lo que sólo se puede tener:

jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
  • Entonces, al agregar los módulos, no es necesario añadir javafx.baseo javafx.graphics, como los que se incluyen desde las dependencias transitivas (esto también se aplica a las dependencias enumeradas en el POM). Véase, por ejemplo javafx.web .

Por lo que tendrá:

jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
    -add-modules chaincoder,javafx.fxml,javafx.web
  • Pero tenga en cuenta que usted tiene un módulo llamado chaincoder, que ya incluye todos los módulos que se requieren, por lo que puede tener sólo esto:

    jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
        -add-modules chaincoder /Users/…/target/chaincoder4-1.0.jar
    

Eso debería funcionar.

En una nota final, usted puede deshacerse de la jfxrt.jardesde el plugin del compilador:

<configuration>
    <source>11</source>
    <target>11</target>
    <compilerArguments>
            <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
    </compilerArguments>
</configuration>

Dado que no existe más. Usted tiene todas las clases de JavaFX incluidos en las dependencias:

<configuration>
    <source>11</source>
    <target>11</target>
</configuration>

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=215360&siteId=1
Recomendado
Clasificación