导出 JAR 后出现 ClassNotFoundException
ClassNotFoundException after JAR is exported
我正在使用 JRE 1.9.0 (9.0.4+ 11)。我正在尝试创建一个可执行 JAR。在我使用 Maven 导出到 JAR 并尝试启动它之后,我收到以下错误:
Exception in thread "JavaFX Application Thread"
java.lang.NoClassDefFoundError:
com/sun/javafx/css/converters/SizeConverter
at org.kordamp.ikonli.javafx.FontIcon$StyleableProperties.(FontIcon.java:265)
at org.kordamp.ikonli.javafx.FontIcon.getClassCssMetaData(FontIcon.java:321)
at org.kordamp.ikonli.javafx.FontIcon.getCssMetaData(FontIcon.java:325)
at javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(Unknown
Source)
at javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(Unknown
Source)
at javafx.graphics/javafx.scene.CssStyleHelper.createStyleHelper(Unknown
Source)
at javafx.graphics/javafx.scene.Node.reapplyCss(Unknown Source)
at javafx.graphics/javafx.scene.Node.reapplyCSS(Unknown Source)
at javafx.graphics/javafx.scene.Node.invalidatedScenes(Unknown Source)
at javafx.graphics/javafx.scene.Node.setScenes(Unknown Source)
at javafx.graphics/javafx.scene.Parent.onChanged(Unknown Source)
...
Caused by: java.lang.ClassNotFoundException:
com.sun.javafx.css.converters.SizeConverter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown
Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown
Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 103 more
这发生在我从中导出 JAR 的同一台机器上。从 IDE 启动时它工作正常,我想我的 IDE (Eclipse) 使用与 Windows 启动我的 JAR 时相同的 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>
这根本不是样式表错误,而是可能是使用了不兼容的 Ikonli 版本。从堆栈跟踪中,我了解到正在使用的 Ikonli 版本可能低于 11
。 JavaFX 9 与某些软件包存在二进制不兼容,例如 CSS 支持已从私有软件包 com.sun.javafx.css
移至 javafx.css
public 软件包。
目前Ikonli有两个发布分支,2_x分支兼容JavaFX 8(最新版本是2.6.0
),主分支兼容JavaFX 11 及更高版本(最新版本为 11.5.0
)。
没有版本兼容Java 9或10。您必须选择Java 8或Java 11+。
我正在使用 JRE 1.9.0 (9.0.4+ 11)。我正在尝试创建一个可执行 JAR。在我使用 Maven 导出到 JAR 并尝试启动它之后,我收到以下错误:
Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: com/sun/javafx/css/converters/SizeConverter at org.kordamp.ikonli.javafx.FontIcon$StyleableProperties.(FontIcon.java:265) at org.kordamp.ikonli.javafx.FontIcon.getClassCssMetaData(FontIcon.java:321) at org.kordamp.ikonli.javafx.FontIcon.getCssMetaData(FontIcon.java:325) at javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(Unknown Source) at javafx.graphics/javafx.scene.CssStyleHelper$CacheContainer.(Unknown Source) at javafx.graphics/javafx.scene.CssStyleHelper.createStyleHelper(Unknown Source) at javafx.graphics/javafx.scene.Node.reapplyCss(Unknown Source) at javafx.graphics/javafx.scene.Node.reapplyCSS(Unknown Source) at javafx.graphics/javafx.scene.Node.invalidatedScenes(Unknown Source) at javafx.graphics/javafx.scene.Node.setScenes(Unknown Source) at javafx.graphics/javafx.scene.Parent.onChanged(Unknown Source)
...
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.css.converters.SizeConverter at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ... 103 more
这发生在我从中导出 JAR 的同一台机器上。从 IDE 启动时它工作正常,我想我的 IDE (Eclipse) 使用与 Windows 启动我的 JAR 时相同的 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>
这根本不是样式表错误,而是可能是使用了不兼容的 Ikonli 版本。从堆栈跟踪中,我了解到正在使用的 Ikonli 版本可能低于 11
。 JavaFX 9 与某些软件包存在二进制不兼容,例如 CSS 支持已从私有软件包 com.sun.javafx.css
移至 javafx.css
public 软件包。
目前Ikonli有两个发布分支,2_x分支兼容JavaFX 8(最新版本是2.6.0
),主分支兼容JavaFX 11 及更高版本(最新版本为 11.5.0
)。
没有版本兼容Java 9或10。您必须选择Java 8或Java 11+。