我在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
如果您有一个简单的(非模块化的)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/bin
on 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更宽容。或者,您可以