NiceLeeのBlog 用爱发电 bilibili~

备忘录 jpackage 修改jar包所在位置(二)

2024-07-06
nIceLee

阅读:


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


内容
隐藏