Java11/JavaFX11/Module Deployment Mess(可运行的Jar,如果单击可以工作,但是如果从命令行运行则不能工作)

Java11/JavaFX11/Module Deployment Mess(可运行的Jar,如果单击可以工作,但是如果从命令行运行则不能工作),java,javafx,Java,Javafx,我不熟悉Java11/所有过于复杂的模块 问题 因此,我将我的Java11/JavaFX11程序作为一个可运行的JAR从Eclipse导出。如果我单击JAR,它运行得非常好(Eclipse在可运行的JAR中自动包含所有模块设置和JavaFX本身)。但是,如果我尝试将JAR与JRE绑定,并通过命令行使用以下BAT文件运行它: @ECHO关闭 %~dp0\jre\bin\java-jar javaprogram.jar 暂停 我得到: 错误:缺少JavaFX运行时组件,运行此应用程序需要这些组件 按

我不熟悉Java11/所有过于复杂的模块

问题

因此,我将我的Java11/JavaFX11程序作为一个可运行的JAR从Eclipse导出。如果我单击JAR,它运行得非常好(Eclipse在可运行的JAR中自动包含所有模块设置和JavaFX本身)。但是,如果我尝试将JAR与JRE绑定,并通过命令行使用以下BAT文件运行它:

@ECHO关闭
%~dp0\jre\bin\java-jar javaprogram.jar
暂停

我得到:

错误:缺少JavaFX运行时组件,运行此应用程序需要这些组件
按任意键继续

我怎样才能让它像我单击它时那样运行JAR文件呢

我试图修复它的方法

最奇怪的是,如果我只使用:

java-jarjavaprogram.jar

它只需访问已安装的JRE,就可以再次工作。只有当我直接将它指向特定路径上的JRE时,它才会出现中断

或者,我只想在JRE旁边捆绑JavaFX,但似乎没有一种方法可以使用相对路径调用
--模块路径
(通过谷歌搜索,我得到了一堆完全不相关的东西)。它似乎需要一个精确的路径,如果人们下载一个zip存档并提取它,这是行不通的。不过这是多余的,因为Eclipse已经在用JAR打包JavaFX了。我不知道为什么仅仅因为我从命令行调用它,它就会变得混乱

项目代码

我试图让它工作的项目恰好是开源的,因此您可以在这里查看它的代码:

主类是JDialogueCore

结束

我不想使用安装程序,因为我觉得那太夸张了。我希望能够像往常一样部署我的软件,只需将它们放在一个可以提取和运行的存档中

简单地用谷歌搜索这些问题是很困难的,因为由于主题的广泛性,我一直得到完全不相关的结果。如有任何与此问题相关的指示/文件,将不胜感激


谢谢你抽出时间

虽然Java8、9和10允许JavaFX子类作为程序启动的主类,但Java11不再是这样。将您的
publicstaticvoidmain
方法放置在不同的类中,并使该类成为主类,就解决了这个问题。(来源:)

命令行调用需要指定JavaFXJAR文件的位置和JavaFX本机库的位置。通常,它们在JavaFXSDK中的位置相同,但必须以不同的方式指定:jar文件位于类路径或模块路径中,而本机库的位置必须在系统属性中指定:

cd /d %~dp0
jre\bin\java -cp javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib com.example.MyNonApplicationClass
如果在程序中定义
module info.java
,则.jar是module.jar,您可以从模块的附加安全性中获益:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp/com.example.MyNonApplicationClass
如果modular.jar文件定义了一个主类,则可以省略类名:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp

请注意,相对路径与
--module path
配合使用很好。相对路径使用当前目录作为基础。当前目录不会仅仅通过将
%~dp0
放在Java调用之前而改变。当前目录是正在运行的命令行或脚本的属性,只能使用
cd
pushd

等命令来更改?使用
jlink
?请显示您正在使用的命令。仅供参考,模块化和非模块化应用程序的产品。嘿,伙计们。我对它进行了一些调整,以消除它的粗鲁(我写这篇文章时真的很热情)。所以首先我要为此道歉。无论如何,JRE全部包含在jar旁边的一个文件夹中。我不使用任何命令,只需在Eclipse中右键单击项目并将其导出为可运行的jar。正如我在文章中提到的,如果我正常单击JAR或从windows命令行运行它,JAR实际上可以完美工作。只有当我尝试使用附带的JRE时才会出现问题。@BasilBourque我已经读过了,但它似乎在请求JavaFX目录的绝对路径(我尝试了其中一些命令但没有成功,它只是给出了相同的错误)。如果我打算从外部包含它,我需要能够从JAR的相对根路径引用它。你知道我怎么做吗?你有明确的
staticvoidmain
方法吗?它是否在扩展javafx.application.application的类中声明?