【问题标题】:ClassNotFoundException after JAR is exportedJAR 导出后的 ClassNotFoundException
【发布时间】: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 我没有清单文件,我去看看,谢谢。
  • 检查您的清单文件。这些链接可能会有所帮助:stackoverflow.com/questions/26074463/…javavids.com/video/how-to-create-runnable-jar-file-with-maven
  • 入口点显然不是问题(错误是由于尝试应用样式表而产生的,如果它不知道要执行哪个 main() 方法就不会这样做)。我不使用 jfoenix,但这看起来像是 JFX 运行时和 JFoenix 库之间的版本问题。

标签: java javafx jfoenix


【解决方案1】:

这根本不是样式表错误,而是可能是使用了不兼容的 Ikonli 版本。从堆栈跟踪中,我收集到正在使用的 Ikonli 版本可能低于11。 JavaFX 9 与某些包存在二进制不兼容性,例如 CSS 支持已从私有包 com.sun.javafx.css 移至 javafx.css 公共包。

Ikonli 目前有两个发布分支,与 JavaFX 8 兼容的 2_x 分支(最新版本为2.6.0),以及与 JavaFX 11 及更高版本兼容的主分支(最新版本为11.5.0) .

没有版本兼容 Java 9 和 10。您必须选择 Java 8 或 Java 11+。

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2021-11-16
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多