|-- BilibiliDown.exe 程序入口
|-- app Windows下,安装包自动生成。告诉`exe`文件如何正确运行
| |-- .package 用于指示程序名称
| |-- BilibiliDown.cfg 用于指示JVM运行的相关配置
| |-- launch.jar jar包
| |-- INeedBiliAV.jar jar包
|-- runtime
打包后的目录默认长上面这样,现在需要将jar包抬上来到根目录(下面这样),并确保程序正常运行
|-- BilibiliDown.exe 程序入口
|-- launch.jar jar包
|-- INeedBiliAV.jar jar包
|-- app Windows下,安装包自动生成。告诉`exe`文件如何正确运行
| |-- .package 用于指示程序名称
| |-- BilibiliDown.cfg 用于指示JVM运行的相关配置
|-- runtime
思路
- 打包后的
{app名称}.exe
程序正常运行的逻辑:- 通过运行程序名
{app名称}.exe
来获取app名称 - 读取
app/{app名称}.cfg
获取jar包依赖、主类入口、JVM运行参数 - 默认以
runtime
文件夹为JRE目录 - 开始运行
- 通过运行程序名
- 我们先读取
{app名称}.cfg
看看具体内容[Application] app.classpath=$APPDIR\launch.jar app.mainclass=nicelee.memory.App app.classpath=$APPDIR\INeedBiliAV.jar [JavaOptions] java-options=-Djpackage.app-version=1.6.31.1 java-options=-Dfile.encoding=utf-8
- 显然,我们要做的是:
- 在打包时,将所有jar包移动到上一层目录
- 修改
{app名称}.cfg
的配置app.classpath=$APPDIR\launch.jar
为app.classpath=launch.jar
- 那具体该要怎么做呢?
在jpackage打包命令追加设置了--temp
和--verbose
命令后,我们可以看到以下log输出:... [10:43:18.349] 使用默认程序包资源 MsiInstallerStrings_de.wxl [WiX 本地化文件](将 MsiInstallerStrings_de.wxl 添加到 resource-dir 中 以进行定制)。 [10:43:18.349] 使用默认程序包资源 MsiInstallerStrings_en.wxl [WiX 本地化文件](将 MsiInstallerStrings_en.wxl 添加到 resource-dir 中 以进行定制)。 [10:43:18.366] 使用默认程序包资源 MsiInstallerStrings_ja.wxl [WiX 本地化文件](将 MsiInstallerStrings_ja.wxl 添加到 resource-dir 中 以进行定制)。 [10:43:18.366] 使用默认程序包资源 MsiInstallerStrings_zh_CN.wxl [WiX 本地化文件](将 MsiInstallerStrings_zh_CN.wxl 添加到 resource-dir 中以进行定制)。 [10:43:18.366] 使用默认程序包资源 main.wxs [主 WiX 项目文件](将 main.wxs 添加到 resource-dir 中以进行定制)。 [10:43:18.366] 使用默认程序包资源 overrides.wxi [覆盖 WiX 项目文件](将 overrides.wxi 添加到 resource-dir 中以进行定制)。 ...
同时,可以注意到在
{temp}/config
目录下,有以下文件:bundle.wxf InstallDirNotEmptyDlg.wxs main.wxs MsiInstallerStrings_de.wxl MsiInstallerStrings_en.wxl MsiInstallerStrings_ja.wxl MsiInstallerStrings_zh_CN.wxl overrides.wxi ui.wxf wixhelper.dll
可以合理地猜测,这些文件都可以通过
--resource-dir
进行配置覆盖。
那么,逐个打开文件,看看配置的成色。
我们注意到bundle.wxf
中包含了源文件到打包后文件的映射:... <DirectoryRef Id="INSTALLDIR"> <Directory Id="dir40f84b56068d341da01a768174eb5e59" Name="app"></Directory> </DirectoryRef> ... <DirectoryRef Id="dir40f84b56068d341da01a768174eb5e59"> <-- 这个id就是app文件夹的id,我们将其改成 INSTALLDIR,这意味着其目录发生了改变 <Component Win64="yes" Id="cfileaaf0a8a4ae4d394785eef8b8714e5d81" Guid="{aaf0a8a4-ae4d-3947-85ee-f8b8714e5d81}"> <File Id="fileaaf0a8a4ae4d394785eef8b8714e5d81" KeyPath="yes" Source="D:\Workspace\BilibiliDown\win_msi\temp\images\win-msi.image\BilibiliDownTest\app\INeedBiliAV.jar"></File> </Component> </DirectoryRef> ... <DirectoryRef Id="dir40f84b56068d341da01a768174eb5e59"> <Component Win64="yes" Id="cfile1fd253aa6905330eb5c08c01f1f3a88b" Guid="{1fd253aa-6905-330e-b5c0-8c01f1f3a88b}"> <File Id="file1fd253aa6905330eb5c08c01f1f3a88b" KeyPath="yes" Source="D:\Workspace\BilibiliDown\win_msi\temp\images\win-msi.image\BilibiliDownTest\app\BilibiliDownTest.cfg"></File> </Component> 上面这个文件代表{app名称}.cfg,我们要将其Source替换为我们自己写的配置文件的地址,而不是默认生成的。 </DirectoryRef> ...
如果可以的话,我们直接编写自己的
bundle.wxf
放到指定的resource-dir
覆盖默认配置即可。
但是考虑到环境的差异性,比如像绝对路径这种显然不太可能硬编码指定。
那么,一个理所当然的解决方案就是: jpackage用两次。
第一次,在指定的temp目录下,获取文件bundle.wxf
、{app名称}.cfg
,修改相应内容。并将bundle.wxf
放到指定的resource-dir
覆盖默认配置。
第二次,生成安装包。