【问题标题】:jdeps fails with Java 11 and JavaFX in fat jarjdeps 在 fat jar 中使用 Java 11 和 JavaFX 失败
【发布时间】:2019-02-18 06:11:26
【问题描述】:

我正在尝试使用 jdeps(和 jlink)来部署使用 JavaFX 11 的 Java 11 应用程序。在我的 Java IDE 中运行良好。但是当我使用 jdep 时出现以下错误,这表明找不到某些模块或包。我被困住了。感谢您的帮助。

jdeps --list-deps --module-path /Users/…/target:/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/jmods:/Users/…/javafx-sdk-11.0.2/lib --添加模块链编码器、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 是

模块链编码器{

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 是

        <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>

【问题讨论】:

    标签: java javafx jlink javafx-11 jdeps


    【解决方案1】:

    您使用maven-dependency-plugin 插件的任何原因?

    如果您看到unpack-dependencies 目标在做什么,您会注意到target/classes 文件夹包含超过 90 MB 的类,在插件提取所有项目依赖项(包括 JavaFX 依赖项)并将它们全部组合后.

    猜猜每个不同 JavaFX 模块的不同 module-info.class 文件会发生什么?只有一个占上风,在这种情况下是来自javafx.media 的那个。

    所以你在target/classes中创建了一个新模块!

    它被命名为javafx.media,包含您的项目类和所有 JavaFX 类,其中包括来自javafx.basejavafx.graphics 的所有类。

    如果您检查此target/classes/module-info.class 文件:

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

    这个“模块”已经包含了所有的 JavaFX 类,还需要再次来自javafx.basejavafx.graphics 的那些类,复制它们。

    这解释了您的错误消息:

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

    现在您可以看到您的 new 模块 javafx.media 包含许多也从 javafx.base 导出到它的包,这违反了 split package not allowed 条件:

    同一个 Java 包只能由单个 Java 模块在运行时导出。换句话说,您不能有两个(或更多)模块同时导出使用中的同一个包。如果你这样做,Java VM 会在启动时报错。

    可能的解决方案

    • 也许您根本不需要maven-dependency-plugin 插件?如果您不需要它,请将其删除。

    • 您正在将包含所有 JavaFX 类的 target 文件夹添加到模块路径:

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

    显然这是错误的,因为 classes 文件夹包含所有 JavaFX 类和错误的模块信息描述符。它不是一个有效的模块,所以只需从模块路径中删除它。

    • 那么就不需要在module-path中添加JDK路径了,默认是这样的。

    所以你可以有:

    jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
    
    • 然后,当您添加模块时,您不需要添加javafx.basejavafx.graphics,因为它们包含在传递依赖项中(这也适用于您的 pom 中列出的依赖项)。参见例如javafx.web

    所以你将拥有:

    jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
        -add-modules chaincoder,javafx.fxml,javafx.web
    
    • 但请注意,您有一个名为 chaincoder 的模块,它已经包含了所有需要的模块,因此您可以只拥有这个:

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

    应该可以的。

    最后一点,您可以从编译器插件中删除 jfxrt.jar

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

    因为它已经不存在了。您拥有包含在依赖项中的所有 JavaFX 类:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2016-12-26
      相关资源
      最近更新 更多