【问题标题】:Is there a way to Debug why my executable JAR of a JavaFX-Project runs on my Computer but not on others ? (Using jdk 1.8._051)有没有办法调试为什么我的 JavaFX 项目的可执行 JAR 在我的计算机上运行而不是在其他计算机上运行? (使用 jdk 1.8._051)
【发布时间】:2019-05-28 16:29:25
【问题描述】:

我导出了一个 JavaFX2 项目的 Jar。它工作正常,但是当我在另一台机器上运行它时,会有一个 classDefNotFoundExeption: javafx.application.Application

任何提示如何解决这个问题?

这是我的清单:

Class-Path: .
Main-Class: proj.view.Launcher

我还编写了启动器,以在找不到 JavaFX 的情况下启动 Swing GUI。

这是我的启动器类


public class Launcher {

    public static void main(String[] args) {

        try {

            Class c = javafx.application.Application.class;
            proj.main.App.main(args);


        }catch (NoClassDefFoundError e) {
            String[] t = {"Swing Backup","Application start Error"};
            MainFrame.remote(t);


        }

    }

}


【问题讨论】:

  • 经过一番思考。我想我会首先检查安装在其他机器上的 java 版本。 java -version。 JavaFX 2.0 并不是超级新的,但它只存在于 Java 8 及更高版本中。看到一些相当旧的 Java JRE 版本仍然存在,我不会感到惊讶。
  • 是您的机器的1.8._051 jdk 还是您遇到异常的机器的jdk?请提供两台机器上jdk的详细信息..
  • jdk1.8.0_051 工作正常。但在另一台机器上是:jdk1.8.0_181 @Babu Sekaran
  • @Luxusproblem jdk1.8.0_181 应该不会失败,但是您可以在添加我在回答中提到的依赖项后尝试构建。
  • @hooknc 但它在另一台机器的 Eclipse-IDE 中编译。并且工作正常。只有 Jar 不能与 FX 一起使用。

标签: java javafx jar runnable-jar


【解决方案1】:

其他计算机正在运行不包含 JavaFX 的 Java 安装。它可以在您的机器上运行,因为您确实安装了 JavaFX。

要测试javafx.application.Application是否可用,需要使用reflection,即

boolean hasJavaFX;
try {
    Class.forName("javafx.application.Application");
    hasJavaFX = true;
} catch (ClassNotFoundException e) {
    hasJavaFX = false;
}
if (hasJavaFX) {
    MainFrame.remote(new String[] {"Swing Backup","Application start Error"});
} else {
    proj.main.App.main(args);
}

【讨论】:

    【解决方案2】:

    当您在 jdk 高于 11 的机器上运行时,您可能会得到 classDefNotFoundExeption: javafx.application.Application

    oracle 已经从 JDK 11 中删除了 javaFX,因此需要提供对 javafx-controls 模块的依赖。

    `<dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>12-ea+9</version>
    </dependency>`
    

    将此添加到您的依赖项中。

    https://openjfx.io/

    【讨论】:

      【解决方案3】:

      在我看来,如果相同的代码在这些机器上通过 IDE 运行,那么它看起来像是可运行的 jar 问题。您可以尝试使用 maven 程序集插件来打包您的 jar。

      Apache Maven 组装插件允许用户将项目输出及其依赖项、模块、站点文档和其他文件聚合到一个可运行的包中。

      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <executions>
              <execution>
                  <phase>package</phase>
                  <goals>
                      <goal>single</goal>
                  </goals>
                  <configuration>
                      <archive>
                      <manifest>
                          <mainClass>
                              package.your_main_class
                          </mainClass>
                      </manifest>
                      </archive>
                      <descriptorRefs>
                          <descriptorRef>jar-with-dependencies</descriptorRef>
                      </descriptorRefs>
                  </configuration>
              </execution>
          </executions>
      </plugin>
      

      【讨论】:

        【解决方案4】:

        我想通了: 指向 JDK10 bin 的是用户路径变量。

        我们改变了路径。现在它可以与“java -jar programm.jar”一起使用 但不是“java programm.jar”

        但不是通过常规单击文件。但是我们编写了一个使用“java -jar”启动应用程序的批处理文件,它工作正常。

        有人解释过这种行为吗?

        【讨论】:

          猜你喜欢
          • 2018-04-23
          • 2020-11-26
          • 1970-01-01
          • 2012-11-04
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多