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

vcudknz3  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(420)

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

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

但是project的output.jar文件(由artifects生成)没有运行。我测试了这些命令,但没有得到任何机会:

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

p、 s:我可以在jdk-10上运行这个项目的.jar文件
编辑:
我下载了javafx并将其lib文件夹添加到系统环境中。为了将javafx添加到项目中,我做了以下过程:project structure>libraries>add>java>javafxpath/lib
然后我在这个过程中为输出jar文件创建了artifect:project structure>artifects>add>jar>from modules with dependencies>main class:main.main。

m0rkklqb

m0rkklqb1#

我遇到过类似的问题:使用javafx和intellij导出/生成一个jar,使用gradle实现非模块化(https://openjfx.io/openjfx-docs/)
我使用gradle jar命令生成的jar没有运行,并且抛出错误,说它找不到我的主类。当我打开jar时,我可以找到我的主类。所以我意识到这个错误与jar Package 有关。

我通过将javafxsdk添加到intellij中的javasdk修复了这个问题,如下所示。

在此之后,我使用常规的gradle build jar命令生成jar文件(如下所示),并且它正常运行。

ar5n3qh5

ar5n3qh52#

最简单的方法是使用包含javafx的openjdk构建。bellsoft和azul都生产这样的产品。
对于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并选择“full jdk”
这些构建基本上是openjdk,添加了openjfxjavafx模块。但是要小心,因为libericafx可能不支持javafx的某些方面。看到了吗https://bell-sw.com/pages/liberica-release-notes-11.0.9.1/

odopli94

odopli943#

如果您有一个简单的(非模块化的)javafx11项目(没有maven/gradle构建工具),并且您正在使用intellij,就像这里的hellofx示例一样,那么您可以通过intellij创建一个jar,该jar可以从控制台运行
关于如何运行项目的完整教程可以在这里找到,关于如何创建jar的说明也可以在这里找到(参见非模块化项目一节),但是这些没有包括 Artifacts 来自intellij。
检查hellofx项目是否使用以下vm选项从intellij运行:

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

哪里 PATH_TO_FX 已设置为 File -> Settings -> Appearance & Behavior -> Path Variables ,指向JavaFXSDK库。
半肥罐
我们可以创建一个jar,它只包含项目中的类和第三方依赖项,而不包含javafx依赖项。
File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies ,添加主类,接受。
然后从列表中删除javafxjar,并接受。

构建项目时,它将创建一个非常小的jar(在本例中为3kb)。
现在您应该能够像这样运行它:

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

(确保 %PATH_TO_FX% 指向有效的文件夹,如果其中包含空格,请使用引号。
您可以分发这个jar,并在其他平台上运行它,前提是这些平台也有javafxsdk。
肥罐
如果您想要一个包含javafx依赖项的全脂jar,您仍然可以使用工件。
File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies ,添加主类,接受。
然后从列表中保留javafxjar,并接受。构建项目。
理论上,你应该能够像这样运行它:

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

但这行不通。
原因1:您需要一个启动器类,如这里所解释的。
所以创建一个启动器类:

public class Launcher {

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

原因2:如果您只将sdk jar添加到fat jar中,您将丢失本机库,如下所述。
因此,编辑工件,选择launcher类作为主类,并添加本机库( Directory Content -> path-to/JavaFX SDK/bin 在windows上):

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

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

您可以分发这个jar,但只能分发到windows平台。
如果您下载其他平台的javafxsdk,您可以为它们创建类似的jar;如果您将它们全部添加到一起,您还可以构建跨平台jar,如上面链接的答案所述。
无论如何,你应该考虑使用 jlink 相反。
笔记
关于此错误:
原因:java.lang.classnotfoundexception:files\java\javafx-sdk-11.0.1\lib
看起来库路径设置时没有引号,并且缺少路径的第一部分 C:\Program Files\... . 一定要用引号:

set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"

相关问题