【问题标题】:Simple Java 11 JavaFXprogram, Error when run from JAR file (Windows)简单的 Java 11 JavaFX 程序,从 JAR 文件运行时出错 (Windows)
【发布时间】:2018-12-10 15:18:48
【问题描述】:

我有一个在 Eclipse 中运行良好的测试 JavaFX 程序。 - 我必须添加一个包含以下内容的模块信息文件 (module-info.java):

module moduletest {
    requires javafx.controls;
    exports com.javafx.test.MenuTest;
}

Java 类:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class MenuTest extends Application {

@Override
public void start(Stage primaryStage) {

    Scene scene = new Scene(new VBox(), 300, 250);

    Circle circle1 = new Circle(-20,0,200);        
    circle1.setFill(Color.CADETBLUE);
    ((VBox) scene.getRoot()).getChildren().addAll(circle1);

    primaryStage.setScene(scene);
    primaryStage.show();        
}

public static void main(String[] args) {
        launch(args);
    }
}

当我使用以下命令将其作为导出的 JAR 文件运行时

java -jar TonyJavaFX.jar -classpath .;./lib/javafx.controls.jar

,我收到以下错误:

错误:无法找到或加载主类 com.javafx.test.MenuTest.MenuTest 引起:java.lang.NoClassDefFoundError: javafx/application/Application

注意:我在运行 jar 的文件夹下直接有一个 lib 文件夹,其中包含所有 JavaFX jar 文件。

【问题讨论】:

  • 除了 nullpointer 的答案之外,您应该将代码作为模块启动;使用--module(或简写版本-m)代替-jar。据我所知,在使用 -jar 时,它不会将 JAR 文件视为模块。这意味着module-info 文件被忽略,系统不知道如何解析javafx.controlsjavafx.graphics 模块。

标签: java javafx java-11 openjfx


【解决方案1】:

您需要确保模块javax.controlsjavafx-graphics.jar 存在于您的模块路径而不是类路径

--module-path ./lib/javafx.controls.jar:./lib/javafx.graphics.jar

注意:这不需要在你的模块声明中添加javafx.graphics 模块,因为javafx.controls 模块需要它。只是模块路径中模块的存在会有所帮助。

重要提示:理想情况下,您应该将完整的 lib 文件夹添加到模块路径。更多在这里 - https://openjfx.io/openjfx-docs/#install-javafx

【讨论】:

  • 我在添加 graphics.jar 时仍然遇到同样的错误。这只是一个测试程序,但我同意我会在“现实生活”中使用模块路径 - 只是试图让某些东西正常工作。
  • @NottmTony 您是如何创建要执行的 .jar 的?您可以按照文档链接,然后按照 Runtime images => Modular CLI 中的说明进行操作
  • @NottmTony 理想情况下,它应该是必须添加到 modulepath 的。原因 - 否则它会导致一个常见的未命名模块,它可能无法解析。
  • 感谢这对我有用:javac --module-path "C:\Program Files\Java\javafx-sdk-11.0.1\lib" --add-modules=javafx.controls MenuTest。爪哇
  • 我决定在命令行构建和运行,这很有效 - 感谢 BUILD javac --module-path "C:\Program Files\Java\javafx-sdk-11.0.1\lib" -- add-modules=javafx.controls MenuTest RUN java --module-path "C:\Program Files\Java\javafx-sdk-11.0.1\lib" --add-modules=javafx.controls MenuTest
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2013-06-30
相关资源
最近更新 更多