首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JDK 11打开JavaFX .jar文件?

如何用JDK 11打开JavaFX .jar文件?
EN

Stack Overflow用户
提问于 2018-11-29 07:00:50
回答 4查看 26.4K关注 0票数 15

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

代码语言:javascript
复制
--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml

但是项目的输出.jar文件(使用人工生成的)没有运行。我测试了这些命令,但没有得到任何机会:

代码语言:javascript
复制
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

命令行的最后错误日志:

代码语言:javascript
复制
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

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

编辑

我下载了JavaFX并将它的lib文件夹添加到系统环境中。为了将JavaFX添加到项目中,我执行了以下过程:项目结构>库>添加> Java > JavaFxPath/lib

然后我在这个过程中为输出jar文件创建了Artifect : Project >Artifect> Add > JAR > From Modules with with> main Class : main.Main。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-29 10:12:52

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

关于如何运行该项目的完整教程可以找到这里,关于如何创建jar的说明是这里 (请参阅非模块化项目一节),但这些指南并不涉及IntelliJ中的Artifacts

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

代码语言:javascript
复制
--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml

其中PATH_TO_FX已在File -> Settings -> Appearance & Behavior -> Path Variables中设置,指向JavaFX SDK库。

半脂肪罐

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

转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies,添加您的主类,接受。

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

构建该项目时,它将创建一个很小的jar (本例中为3KB)。

现在您应该能够像这样运行它:

代码语言:javascript
复制
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依赖项的完整胖jar,您仍然可以使用工件。

转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies,添加您的主类,接受。

然后将JavaFX jars从列表中保留,并接受。建造这个项目。

理论上,您应该能够像这样运行它:

代码语言:javascript
复制
java -jar out\artifacts\HelloFX_jar\HelloFX.jar

但这行不通。

原因1:您需要一个启动器类,正如解释的这里

所以创建一个launcher类:

代码语言:javascript
复制
public class Launcher {

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

原因2:如果您只将SDK添加到胖jar中,您将丢失本机库,正如这里所解释的那样。

因此,编辑工件,选择Launcher类作为主类,并添加本机库(Directory Content -> path-to/JavaFX SDK/bin on Windows):

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

代码语言:javascript
复制
java -jar out\artifacts\HelloFX_jar\HelloFX.jar

您可以分发此jar,但只能分发到Windows平台。

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

无论如何,您应该考虑使用jlink 相反,

备注

关于这个错误:

原因: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

看起来库路径是在没有引号的情况下设置的,并且缺少路径C:\Program Files\...的第一部分。只需确保你使用引号:

代码语言:javascript
复制
set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"
票数 20
EN

Stack Overflow用户

发布于 2019-09-30 12:54:39

我也有过类似的问题,使用JavaFX和IntelliJ非模块化的Gradle (https://openjfx.io/openjfx-docs/)导出/生成Jar。

我使用Gradle jar命令生成的jar没有运行,并抛出错误,说它找不到我的主类。当我打开我的罐子时,我找到了我的主要课程。所以我意识到这个错误与Jar打包有关。

我通过将JavaFX SDK添加到SDk中的IntelliJ中来解决这个问题,如下所示。

在此之后,我使用常规的Gradle build Jar命令来生成我的Jar文件(如下所示),它将正常运行。

票数 3
EN

Stack Overflow用户

发布于 2020-12-07 00:56:03

最简单的方法是使用包含OpenJDK的JavaFX构建。Bellsoft和Azul都生产这样的产品。

关于阿祖尔的祖鲁OpenJDK的构建:https://www.azul.com/downloads/zulu-community/?version=java-11-lts&package=jdk-fx

对于Bellsoft Liberica JDK:https://bell-sw.com/pages/downloads/#/java-11-lts并选择“完全JDK”

这些构建基本上是OpenJDK,添加了OpenJFX JavaFX模块。但是要小心,因为JavaFX的某些方面在LibericaFX上可能不受支持。请参阅https://bell-sw.com/pages/liberica-release-notes-11.0.9.1/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53533486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档