JAVA_HOME指向JRE时,Javafx着色Jar不工作



我创建了一个在java 11上运行的着色jar。当我除了安装了11个之外没有其他java版本时,一切都很好

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

JAVA_HOME:C:\jdk\(Jar Working(

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)

基本答案很简单。JavaFX 11+不在Java 8上运行。这与你的明暗处理无关。

我希望我的jar只在java 11上运行,为此我向客户端提供捆绑的11 jre,这很好,但当客户端预先安装了设置为1.8 jre的java_home时,它会给我空指针异常,我已经发布了

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


我建议不要使用zenjava JavaFX Maven插件,我认为它很旧,没有维护,而是使用openjfx JavaFX Maven。

着色也可能是不必要的。

您可能希望使用JavaFXMaven插件与jlink的集成来封装应用程序及其所需的Java运行时组件,而不是发布Java11。

有关jlink以及如何在独立模式下使用它的信息,请参阅此jlink手册页和Baeldung jlink教程。

我之前链接的openjfx文档有关于创建";自定义JDK+JavaFX图像";它描述了使用jlink命令行工具为JavaFX应用程序创建运行时映像的过程。

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

如果需要,还可以使用Java14+中的javapackager工具为应用程序生成安装程序。


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

最新更新