【问题标题】:Javafx Shaded Jar Not Working when JAVA_HOME is pointing to JRE当 JAVA_HOME 指向 JRE 时,Javafx Shaded Jar 不工作
【发布时间】:2021-05-05 08:35:26
【问题描述】:

我创建了一个在 java 11 上运行的阴影 jar。 当我没有安装除 11 以外的其他 Java 版本时,一切正常

但是当我也安装 java home 并将其设置为 java 8 时

JAVA_HOME: C:\jdk\(Jar 工作)

JAVA_HOME: C:\jdk\jre\(Jar Not Working 显示空白屏幕) [1]:https://i.stack.imgur.com/s28ef.jpg

注意:c:\jdk 是 java 8 路径

下面是我创建阴影罐的pom

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>test</description>


<properties>
    <!-- Generic properties -->
    <java.version>11.0.7</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>

                <mainClass>GUIStarter</mainClass>
                <systemProperties>
                <systemProperty>
                    <key>prism.allowhidpi</key>
                    <value>false</value>
                </systemProperty>
            </systemProperties>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.zenjava</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>8.1.3-SNAPSHOT</version>
            <configuration>
                <mainClass>GUIStarter</mainClass>
                <bundler>EXE</bundler>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <options>
                    <option>--add-opens</option>
                    <option>javafx.graphics/javafx.css=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.base/com.sun.javafx.runtime=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.base/com.sun.javafx.binding=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.base/com.sun.javafx.event=ALL-UNNAMED</option>
                    <option>--add-opens</option>
                    <option>javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED</option>
                    <option>--add-exports</option>
                    <option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix</option>
                    <option>--add-exports</option>
                    <option>javafx.controls/com.sun.javafx.scene.control=com.jfoenix</option>
                    <option>--add-exports</option>
                    <option>javafx.base/com.sun.javafx.binding=com.jfoenix</option>
                    <option>--add-exports</option>
                    <option>javafx.graphics/com.sun.javafx.stage=com.jfoenix</option>
                    <option>--add-exports</option>
                    <option>javafx.base/com.sun.javafx.event=com.jfoenix</option>
                </options>
                <mainClass>GUIStarter</mainClass>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <options>
                            <option>--add-opens</option>
                            <option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix
                            </option>
                            <option>--add-opens</option>
                            <option>javafx.controls/com.sun.javafx.scene.control=com.jfoenix
                            </option>
                        </options>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                <Multi-Release>true</Multi-Release>
                                <Main-Class>GUIStarter</Main-Class>
                                </manifestEntries>

                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我尝试从命令提示符执行 Jar,但在启动时遇到异常

java.lang.NullPointerException
    at com.sun.javafx.font.directwrite.DWGlyph.createBitmap(DWGlyph.java:287)
    at com.sun.javafx.font.directwrite.DWGlyph.getCachedBitmap(DWGlyph.java:273)
    at com.sun.javafx.font.directwrite.DWGlyph.getD2DMask(DWGlyph.java:167)
    at com.sun.javafx.font.directwrite.DWGlyph.getPixelData(DWGlyph.java:352)
    at com.sun.prism.impl.GlyphCache.getCachedGlyph(GlyphCache.java:258)
    at com.sun.prism.impl.GlyphCache.render(GlyphCache.java:148)
    at com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2101)
    at com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312)
    at com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270)
    at com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
    at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
    at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
    at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.base/java.lang.Thread.run(Thread.java:834)

【问题讨论】:

  • shaded jar file 中有什么内容?那里的 Java FX11+ 类和本机库是否与 Java 8 中的 JavaFX 类和本机库不兼容?此外,编译器的目标 11 可能会创建与 Java 8 不兼容的 Java 字节码。
  • 另请注意,Java 11 不包含 JavaFX,因此您需要将其包含在您的 fat jar 中,但 JavaFX 8 确实包含 JavaFX,它是一个不同的不兼容版本,因此您不能包含 JavaFX胖 jar 中的类以在 JavaFX 8 上执行,所以我看不出你如何能够实现你想要的并创建一个能够在 Java 11 和 Java 8 上运行的单个 Jar。
  • @jewelsea 我不希望我的 jar 能够在 java 8 和 java 11 上运行,我希望我的 jar 只能在 java 11 上运行,为此我向客户端提供捆绑的 11 jre这工作正常,但是当客户端预先安装 java_home 设置为 1.8 jre 时,它​​给了我我发布的空指针异常
  • 我明白了,这些信息很有帮助,我从你的问题中并不清楚。
  • 大家好,感谢您的回答,我能够解决这个问题。我有一个 jar org.openjfx » javafx-graphics » 11.0.2,它给出了空指针异常,我将 jar 更新到版本 13,问题得到解决。所以从 13 开始的任何版本都不会给出空指针异常。

标签: java java-8 jar java-11 javafx-11


【解决方案1】:

基本答案很简单。 JavaFX 11+ 不能在 Java 8 上运行。这与您的阴影或其他任何事情无关。

【讨论】:

  • 我知道 JavaFx11+ 不能在 Java 8 上运行。在 maven 编译器插件中,源和目标被称为 11。 Jar 甚至可以使用当前版本的 java 执行,并已在任务管理器中签入。当环境变量 java_home 指向 jdk 时它也可以工作。只有当环境变量 java_home 指向 jre 时才会出现问题。
【解决方案2】:

我希望我的 jar 仅在 java 11 上运行,为此我向客户端提供捆绑的 11 jre,并且工作正常,但是当客户端预先安装 java_home 设置为 1.8 jre 时,它​​给了我空指针异常我已经发布了

您将需要一个独立于 JAVA_HOME 设置的部署方法,以便该设置不会干扰您的应用程序的执行。该答案的其余部分提供了一些可用于实现此目的的选项。


我建议不要使用zenjava JavaFX Maven plugin,我认为它已经过时且未维护,而是使用openjfx JavaFX Maven plugin。

Shading 也可能没有必要。

您可能希望使用 JavaFX Maven 插件与 jlink 集成来打包应用程序及其所需的 Java 运行时组件,而不是发布 Java 11。

有关 jlink 以及如何在独立模式下使用它的信息,请参阅 jlink man page 和 Baeldung jlink tutorial。

我之前链接的 openjfx 文档包含有关创建“自定义 JDK+JavaFX 映像”的信息,该文档描述了使用 jlink 命令行工具为 JavaFX 应用程序创建运行时映像的过程。

但是,由于您已经在使用 Maven,因此使用 JavaFX Maven 插件与 jlink 的内置集成可能比使用独立的命令行 jlink 工具更容易。 JavaFX maven 插件与 jlink 的集成还具有创建启动器脚本的选项。我相信,如果您使用它,它将独立于环境中的 JAVA_HOME 设置(有关如何实现此功能的更多信息,请参阅我在 openjfx JavaFX maven 插件上链接的文档)。

如果需要,您还可以使用 the javapackager tool from Java 14+ 为您的应用程序生成安装程序。


对于遇到这个问题并对 JavaFX 部署机制感兴趣的任何人,我相信目前,信息的第一站应该是openjfx documentation。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2017-09-15
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2021-09-15
    • 2017-04-07
    相关资源
    最近更新 更多