【发布时间】: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