【问题标题】: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 pageBaeldung 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
    相关资源
    最近更新 更多