|-- 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覆盖默认配置。
第二次,生成安装包。