当前位置: 首页 > 知识库问答 >
问题:

如何用JDK11打开JavaFX.jar文件?

淳于煌
2023-03-14

我在IntelliJ中创建了一个JavaFX项目。我可以在Intellij中运行项目。我在配置中添加了以下代码):

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml

但是project的输出.jar文件(用Artificects制作)不会运行。我测试了这些命令,但没有得到任何机会:

java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar
Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

附注:在JDK-10上构建时,我可以运行这个项目的.jar文件

编辑:

我下载了JavaFX,并将其lib文件夹添加到系统环境中。为了将JavaFX添加到项目中,我执行了以下过程:project Structure>Libraries>add>Java>JavaFXPath/lib

共有1个答案

商勇
2023-03-14

如果您有一个简单的(非模块化的)JavaFX 11项目(不使用Maven/Gradle构建工具),并且您正在使用IntelliJ,就像这里的HelloFX示例一样,这就是如何从IntelliJ创建一个可以从控制台运行的jar

关于如何运行项目的完整教程可以在这里找到,关于如何创建jar的说明也在这里(参见非模块化项目一节),但这些不包括IntelliJ的artifacts

检查HelloFX项目是否使用以下VM选项从IntelliJ运行:

--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml

其中path_to_fx已在文件->设置->外观&行为->路径变量中设置,指向JavaFX SDK库。

半肥罐

我们可以创建一个只包含项目中的类和第三方依赖项的Jar,而不包含JavaFX依赖项。

转到文件->项目结构->工件->添加->JAR->来自具有依赖项的模块,添加主类,接受。

然后从列表中删除JavaFX JAR,并接受。

现在您应该可以运行它,如下所示:

java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar

(确保%path_to_fx%指向有效文件夹,如果其中包含空格,请使用引号。

您可以分发这个jar,并在其他平台中运行它,前提是这些平台也有JavaFX SDK。

肥罐

如果您想要一个包含JavaFX依赖项的full fat jar,您仍然可以使用工件。

转到文件->项目结构->工件->添加->JAR->来自具有依赖项的模块,添加主类,接受。

然后从列表中保留JavaFX JAR,并接受。构建项目。

从理论上讲,您应该能够像以下方式运行它:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

因此创建一个启动器类:

public class Launcher {

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

原因2:如果只将SDK jar添加到fat jar中,就会丢失本机库,如本文所述。

因此,编辑工件,选择Launcher类作为主类,并添加本机库(directory content->path-to/javafx sdk/binon Windows):

现在构建项目(现在jar约为33 MB,包含不必要的本机库)并运行:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

您可以分发此jar,但仅限于Windows平台。

如果下载JavaFX SDK,您可以为其他平台创建类似的JAR,如果将它们全部添加在一起,您也可以构建跨平台JAR,如上面链接的答案所述。

无论如何,您应该考虑改用jlink

备注

关于此错误:

库路径的设置似乎没有引号,并且缺少路径C:\program files\...的第一部分。请确保使用引号:

set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"
 类似资料:
  • 问题内容: 我想打开文件以使用argparse进行读取。在cmd中,它必须类似于:my_program.py / filepath 那是我的尝试: 问题答案: 参数的类型应为字符串(无论如何都是默认值)。因此,使它像这样:

  • 问题内容: 我有一个将pdf文件作为ByteArrayOutputStream写入servlet的输出流的servlet。如果打开servlet URL,浏览器将打开文件。但是,如果在Servlet上发生错误,浏览器会打开一个带有错误消息的空白pdf。通过ServletResponse发送错误,浏览器将打开默认错误页面。 我要发送错误消息,而不重定向到错误页面或打开无效的pdf文件。 我试过了:

  • 问题内容: 我有一个叫做html的文件。 我打开test.html并使用以下代码块打印内容: 但它可以打印,为什么会发生这种情况,我该如何解决? 顺便说一句。当我打开文本文件时,效果很好。 编辑:我试过这个: 问题答案: 尝试这样的事情。

  • 问题内容: 我尝试通过Java程序从本地(在我的系统中)打开HTML文件。我尝试了一些通过堆栈溢出获得的程序,但是它不能正常工作。 对于EG: 我有这个小的HTML文件。 我的Java代码: 任何解决方案或技巧表示赞赏。 问题答案: 我希望使用默认浏览器

  • 问题内容: 我是一个初学者,现在我想用java启动GUI应用程序。我开始阅读一些有关FX的书籍,但并未在JDK11上编译..我是否需要使用jdk8还是有什么办法可以在jdk11上完成? 问题答案: JavaFX已脱离JDK11(Oracle的官方JDK和OpenJDK)的捆绑。为了将JavaFX与JDK11结合使用,您必须下载独立的JavaFX11运行时。

  • 问题内容: 我正在尝试使用javascript从JSON文件中提取元素,但是却收到一条错误消息,提示它无法加载JSON文件。 这是我的代码如下所示: 这是控制台吐出的错误: 问题答案: d3.json用于通过HTTP加载数据。正如@Quentin所说,您可以设置一个本地服务器来通过HTTP提供数据。 对于这样的开发,我使用firefox,它在处理本地跨源请求时似乎比chrome更宽容。或者,您可以