【发布时间】:2020-05-01 10:03:20
【问题描述】:
我正在使用 JRE 1.9.0 (9.0.4+ 11)。我正在尝试创建一个可执行的 JAR。在我使用 Maven 导出到 JAR 并尝试启动它后,我收到以下错误:
线程“JavaFX 应用程序线程”中的异常 java.lang.NoClassDefFoundError: com/sun/javafx/css/converters/SizeConverter 在 org.kordamp.ikonli.javafx.FontIcon$StyleableProperties.(FontIcon.java:265) 在 org.kordamp.ikonli.javafx.FontIcon.getClassCssMetaData(FontIcon.java:321) 在 org.kordamp.ikonli.javafx.FontIcon.getCssMetaData(FontIcon.java:325) 在 javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(未知 资源) 在 javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(未知 资源) 在 javafx.graphics/javafx.scene.CssStyleHelper.createStyleHelper(未知 资源) 在 javafx.graphics/javafx.scene.Node.reapplyCss(未知来源) 在 javafx.graphics/javafx.scene.Node.reapplyCSS(未知来源) 在 javafx.graphics/javafx.scene.Node.invalidatedScenes(未知来源) 在 javafx.graphics/javafx.scene.Node.setScenes(未知来源) 在 javafx.graphics/javafx.scene.Parent$2.onChanged(Unknown Source)
...
引起:java.lang.ClassNotFoundException: com.sun.javafx.css.converters.SizeConverter 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(未知 资源) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(未知 资源) 在 java.base/java.lang.ClassLoader.loadClass(未知来源) ... 103 更多
这发生在我从中导出 JAR 的同一台机器上。从 IDE 启动时它工作正常,我想我的 IDE (Eclipse) 在启动我的 JAR 时使用与 Windows 相同的 JRE,因为它是我安装的唯一一个。我在 Maven 中包含的库是 ikonli 2.3.0 和 jfoenix 9.0.8。
我还尝试用 Launch4J 包装同一个 JAR,但遇到了同样的问题。
这是从我的 pom.xml 文件构建的
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.project.Main</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>
com.project.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
【问题讨论】:
-
导出到 Runnable JAR 文件时需要指定入口点。入口点是包含要在运行 JAR 文件时执行的主要方法的 Java 文件。确保在 JAR 文件中也导出资源。
-
你是如何尝试执行它的?您是否在清单文件中指定了外部库?
-
@lucsbelt 我没有清单文件,我去看看,谢谢。
-
入口点显然不是问题(错误是由于尝试应用样式表而产生的,如果它不知道要执行哪个 main() 方法就不会这样做)。我不使用 jfoenix,但这看起来像是 JFX 运行时和 JFoenix 库之间的版本问题。