我使用jpackage
(与JDK 14一起)来创建独立的JavaFX应用程序。
jpackage
的输出看起来很奇怪,它由两个相同的JRE副本组成,并且app
文件夹中除App.cfg
文件之外的所有文件都可以删除,没有任何问题。 / p>
jpackage
不能生成不必要的文件吗?
我所拥有的:
我有一个根据Maven原型org.openjfx:javafx-archetype-simple:0.0.3
创建的简单项目。
我刚刚添加了maven-shade-plugin
来创建具有依赖项的jar和一个简单的启动类(例如NewMain
类here)。
我这样做:
mvn package
mvn javafx:jlink
jpackage --package-type app-image --dest targetApp --name App --runtime-image target/image --main-jar testApp-1.0-SNAPSHOT.jar --input target
结果,我有两个带有JRE的文件夹(完全相同):
targetApp\App\runtime
targetApp\App\app\image
targetApp\App\app
中的所有文件(和文件夹)(JRE(〜53 MB),Jar(〜9 MB),类...)都可以安全地删除,App.cfg
文件除外。 / p>
删除这些文件后,我运行targetApp\App\App.exe
,它运行正常。
删除操作将App
的大小从118 MB减小到56 MB。
另一个问题:我使用Windows,jpackage
会为Windows生成结果(很多dll
文件和exe
),我可以创建吗Windows for Mac和Linux上的独立应用程序?
答案 0 :(得分:1)
之所以得到此结果,是因为您已经创建了一个uber-jar,其中包含除通过--input target
指定的内容外的所有内容,根据文档,此文件具有以下作用。
All files in the input directory will be packaged into the
application image.
尝试仅删除选项--input target
还是不创建uber-jar起作用。而是使用maven-dependency-plugin将所有依赖项复制到一个文件夹中,例如target/libs
,然后显式指定--input target/libs
。
您的第二个问题: 如果这是您的问题,则不能为其他目标交叉创建应用程序。
答案 1 :(得分:0)
您可能想在GitHub上检出JPackageScriptFX项目。它包含一个示例性的多模块maven项目结构以及Mac和Windows的构建脚本,这些脚本将为这两个平台构建所有可用的包类型和可执行文件。您可以在这里找到它:https://github.com/dlemmermann/JPackageScriptFX
答案 2 :(得分:0)
我没有Oracle jpackage
的解决方案:
jpackager
+ macOS => .pkg
,.dmg
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk
jpackager
(在我的情况下为osx)。解压缩。jdk.packager.jar
和jpackager
复制到/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin
(!!!)/yourworkspace/target
中的/yourworkspace/jlink
在您的JRE上用bin
,lib
等表示。您可能是通过jlink
创建的。 (就我而言,我有我的自定义JRE + JavaFX模块)/yourworkspace/icons
包含 .icns 。workspace
中用以下内容#! /bin/bash
ABSPATH=$(cd "$(dirname "$0")"; pwd -P)
launcher=`ls $ABSPATH/target/*.jar`
for eachfile in $launcher
do
if [ -f "$eachfile" ];then
echo Creating .pkg ...
echo "$eachfile"
basename="${eachfile##*/}"
/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/bin/jpackager \
create-installer \
--runtime-image $ABSPATH/jlink \
--name ProgramA \
--input $ABSPATH/target \
--main-jar $basename \
--version 1.0 \
--copyright "Nikita Gromov 2020" \
--name "ProgramA-macos" \
--mac-bundle-name "ProgramA" \
--output $ABSPATH/appimage \
--icon $ABSPATH/icons/20200220101822955_easyicon_net_32.icns
fi
done
双击位于/yourworkspace
中的 jpackager.command ,然后等待jpackager
创建 ProgramA-macos-1.0.pkg 和/yourworkspace/appimage
我没有Oracle jpackage
的解决方案:
jpackager
+ Windows => .msi
C:\Program Files\AdoptOpenJDK\jdk-11.0.6.10-hotspot
jpackager
(在本例中为获胜)。解压缩。jdk.packager.jar
和jpackager
复制到C:\Program Files\AdoptOpenJDK\jdk-11.0.6.10-hotspot\bin
(!!!)/yourworkspace/target
中的/yourworkspace/jlink
在您的JRE上用bin
,lib
等表示。您可能是通过jlink
创建的。 (就我而言,我有我的自定义JRE + JavaFX模块)/yourworkspace/icons
包含 .icns 。/yourworkspace
文件夹中set openjdk=C:\Program Files\AdoptOpenJDK\jdk-11.0.6.10-hotspot\bin
set saveto=%cd%
cd %openjdk%
jpackager create-installer --runtime-image %saveto%/jlink --input %saveto%/target --main-jar ProgramA.jar --version 1.0 --copyright "Nikita Gromov" --name "ProgramA-win" --output %saveto%/appimage --icon %saveto%/icons/icon.ico --win-menu --win-shortcut --win-dir-chooser
注意 ProgramA.jar 应该位于/yourworkspace/target
路径(!!!)
双击位于/yourworkspace
中的 jpackager.bat ,然后等到jpackager
创建 ProgramA-win-1.0.msi 在/yourworkspace/appimage
创建/yourworkspace/jlink.bat
文件。内容应为:
SET openjdk=C:\Program Files\AdoptOpenJDK\jdk-11.0.6.10-hotspot\bin
SET fx=C:\Programme\AdoptOpenJDK\javafx-jmods-11.0.2
set saveto=%cd%
cd %openjdk%
jlink --module-path %fx% --add-modules=javafx.base --add-modules=javafx.controls --add-modules=javafx.fxml --add-modules=javafx.graphics --add-modules=javafx.web --add-modules=javafx.media --add-modules=javafx.swing --bind-services --output "%saveto%\jlink"
这将使用自定义JRE + JavaFX库创建/yourworkspace/jlink
文件夹,您将链接到jpackager
。