Jpackage 与 ControlsFX

dro*_*oid 4 java javafx intellij-idea maven jpackage

我\xe2\x80\x99m 在使用 Jpackage 时遇到一些问题,包括 Controlsfx。

\n

我已经使用 Maven Central 的原型在 IntelliJ 和 JavaFX 中建立了一个项目。与 IntelliJ 中的 JavaFX 配合良好。我可以使用 Maven(来自 IntelliJ)将其打包,并使用 JPackage 来制作 exe 安装程序,这也可以正常工作。I\xe2\x80\x99m 使用此命令与 JPackage:

\n
jpackage --input C:\\...\\target --add-modules javafx.controls --module-path C:\\...\\openjfx-20.0.1_windows-x64_bin-jmods\\javafx-jmods-20.0.1 --module-path --win-console --dest c:\\outputs --main-jar tests-1.0-SNAPSHOT.jar --main-class tests.App\n
Run Code Online (Sandbox Code Playgroud)\n

现在我想合并 ControlsFX,因此我从 Maven 下载 ControlsFX .JAR: https: //mvnrepository.com/artifact/org.controlsfx/controlsfx/11.1.2IntelliJ \n在 IntelliJ 中,我将其添加为模块。好吧,我想在我的项目中使用 ControlsFX。

\n

现在我想制作一个 exe 安装程序(如上面没有 ControlsFX 的那样),因此我将 ControlsFX 添加到我的 JPackage 命令中:

\n
jpackage --input C:\\...\\target --add-modules javafx.controls,controlsfx --module-path C:\\...\\openjfx-20.0.1_windows-x64_bin-jmods\\javafx-jmods-20.0.1 --module-path C:\\..\\controlsfx --win-console --dest c:\\test --main-jar tests-1.0-SNAPSHOT.jar --main-class tests.App\n
Run Code Online (Sandbox Code Playgroud)\n

运行命令时我得到这个:

\n

java.lang.module.FindException:找不到模块controlsfx

\n

我知道我的问题与我传递给 JPackage 的命令有关,但无法弄清楚是什么。

\n

Dun*_*ncG 5

正如@Slaw 在下面的评论中提到的,您使用了错误的模块名称。您可以通过查看模块定义来确认 jar 的模块名称。这告诉您与 jpackage 一起使用的模块的名称,例如,如果是非模块 jar,org.controlsfx.controls则将打印:No module descriptor found. Derived automatic module.

jar --file=controlsfx.jar --describe-module
org.controlsfx.controls@11.1.2 jar:file:///c:/dev/mods/controlsfx.jar!/module-info.class
... plus details of exports
Run Code Online (Sandbox Code Playgroud)

jpackage命令将在内部使用jlink来构建包含列出的所有模块的运行时映像:

jpackage --input myinput --add-modules javafx.controls,org.controlsfx.controls --module-path c:\xyz...\javafx-jmods-NN --module-path c:\abc...\controlsfx.jar  --dest myoutput {otherargs}
Run Code Online (Sandbox Code Playgroud)

安装后,您可以使用以下命令检查已安装的运行时中包含哪些模块:

 C:\Program Files\XYZ\runtime\bin\java --list-modules
 ...
 javafx.controls@somever
 ...
 org.controlsfx.controls@somever
Run Code Online (Sandbox Code Playgroud)

jpackage或者,您可以通过将 jar 复制到目录下某处的目标发布结构中来使用 jar(模块或非模块)--input。然后它将作为类路径 jar 依赖项(在发布目录内)而不是作为模块依赖项(在运行时映像内,如上所述)被选取。

您可以通过查看生成的文件来检查是否将 jar 添加为类路径依赖项{launcher}.cfg,它应该包含一行:

 app.classpath=$APPDIR\whateverplaceunder--input.dir\controlsfx.jar
Run Code Online (Sandbox Code Playgroud)

  • `jlink` 不需要 JMOD 文件。只要 JAR 文件有一个“module-info”描述符,它就可以正常工作。如果您想以干净的方式将本机代码和许可证等内容与类文件一起打包,则只需要 JMOD 文件。 (2认同)
  • @droid你的问题中有`--add-modules javafx.controls,controlsfx`,但是[模块名称](https://github.com/controlsfx/controlsfx/blob/0a8caa4ad2abb3dea48fecb10819ea540748e308/controlsfx/src/main/java /module-info.java#L31) _ControlsFX_ 是 `org.controlsfx.controls`。 (2认同)