导出 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+。