我在IntelliJ中创建了一个JavaFX项目。 我可以在IntelliJ中运行项目。我在配置中添加了以下代码):
--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
但是项目(由Artifects制成)的输出.jar文件未运行。我测试了这些命令,但没有任何机会:
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添加到项目中的过程如下: 项目结构>库>添加> Java> JavaFxPath / lib
然后我在此过程中为输出jar文件创建了Artifect: 项目结构> Artifects>添加> JAR>来自具有依赖性的模块> main类:main.Main。
答案 0 :(得分:7)
假设您有一个简单的(非模块化)JavaFX 11项目(没有Maven / Gradle构建工具),并且您正在使用IntelliJ,就像here中的HelloFX示例一样, 这就是您可以从IntelliJ创建可以从控制台运行的jar的方法
可以找到关于如何运行项目的完整教程here,有关如何创建jar的说明则是here(请参阅非模块化项目部分),但是这些并不涵盖Artifacts
来自IntelliJ。
使用以下VM选项检查HelloFX项目是否从IntelliJ运行:
--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(在这种情况下为3 KB)。
现在您应该可以像这样运行它了
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依赖项的完整胖子,仍然可以使用工件。
转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
,添加主类,接受。
然后从列表中保留 JavaFX jar ,并接受。构建项目。
理论上,您应该能够像这样运行它:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
但是这行不通。
原因1:您需要一个启动器类,如here所述。
因此创建一个启动器类:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
原因2:如果仅将SDK jar添加到胖jar中,则会缺少本机库,如here所述。
因此,请编辑工件,选择Launcher类作为主类,然后添加本机库(在Windows上为Directory Content -> path-to/JavaFX SDK/bin
)
现在构建项目(现在jar约为33 MB,并包含不必要的本机库)并运行:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
您可以分发此jar,但只能分发到Windows平台。
如果您下载了其他平台的JavaFX SDK,则可以为其他平台创建类似的jar,如果将它们全部添加在一起,也可以构建跨平台的jar,如上面的链接的答案所述。
无论如何,您应该考虑使用jlink
instead。
注意
关于此错误:
原因: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"
答案 1 :(得分:2)
在使用 JavaFX和IntelliJ Non-modular with Gradle (https://openjfx.io/openjfx-docs/)
导出/生成Jar时,我遇到了类似的问题我使用Gradle jar命令生成的jar无法运行,并抛出错误,表明找不到主类。当我打开罐子时,我可以找到我的主班。因此我意识到错误与Jar Packaging有关。
我通过在IntelliJ中的Java SDk中添加JavaFX SDK来解决了该问题,如下所示。
此后,我使用常规的Gradle build Jar命令生成我的Jar文件(如下所示),并且该文件正常运行。
答案 2 :(得分:1)
以上答案适用于非模块化 JavaFX 项目。为了让模块化 JavaFX 项目(具有模块化依赖项)运行,我使用了 jlink。
将 JavaFX SDK 从 https://gluonhq.com/products/javafx/; 解压到一个目录,并将 shell 变量 JFX_LIB
指向解压后的 lib/
目录。
从 https://gluonhq.com/products/javafx/; 中提取 JavaFX jmods(不是 SDK)文件,解压 jmods,它们位于类似于 javafx-jmods-11.0.2/
的文件夹中。将 shell 变量 JMOD_PATH
指向解压后的目录 javafx-jmods-11.0.2/
。
编译,将编译后的类发送到目录mods/
:
javac -d mods --module-source-path src --module-path $JFX_LIB/javafx.graphics.jar:$JFX_LIB/javafx.base.jar:$JFX_LIB/javafx.controls.jar --module com.mymodule
用jlink创建自定义JRE,参考包含JavaFX mods和自己编译的mod的模块路径:
jlink --module-path $JMOD_PATH:mods --add-modules com.mymodule --output customjre
运行:
customjre/bin/java --module com.mymodule/com.mymodule.Main
(我尝试了很长时间来让 java -jar
与 --module-path
和 --add-modules
一起运行。我总是收到以下错误:)
Error: Could not find or load main class com.mymodule.Main
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
答案 3 :(得分:0)
最简单的方法是使用包含JavaFX的OpenJDK构建。 Bellsoft和Azul都生产这种版本。
对于Azul的Zulu版本的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模块。尽管要小心,因为LibericaFX可能不支持JavaFX的某些方面。参见https://bell-sw.com/pages/liberica-release-notes-11.0.9.1/