方块糖的工坊
方块糖的工坊

使用jdk14的jpackage将springboot项目打包成msi和rpm

准备Jar

首先新建一个springboot工程,并为其添加一个测试接口,代码如下:

@RestController
@RequestMapping("/ag")
public class AgentController {

    @GetMapping("/sayHello")
    public String sayHello() {
        return "Hello World";
    }
}

然后将其打包,其输出结果为agent-0.0.1-SNAPSHOT.jar这个可执行jar包。

rpm生成

linux测试环境为CentOS 7.6
首先下载jdk14,选择Linux / x64版本,然后解压

cd /opt/
tar -zxvf openjdk-14.0.1_linux-x64_bin.tar.gz

执行以下命令生成rpm包:

/opt/jdk-14.0.1/bin/jpackage -n zzjz-agent \
-i /opt/rpmJar/jpackage/ --main-jar agent-0.0.1-SNAPSHOT.jar \
-d /opt/rpmJar/jpackage

可惜会报错:==错误:类型 [null] 无效或不受支持
网上查了半天是需要先安装rpm-build这个包装工具,同样的其他环境入ubuntu和windows都有对应底层包装工具,ubuntu下是fakeroot,windows下是 WiX 3.0 or later

 yum install rpm-build

安装之后重新执行命令就会生成rpm包,然后通过rpm命令安装,发现创建/opt/zzjz-agent的目录,按如下命令启动即可

# 安装
rpm -ivh zzjz-agent-1.0-1.x86_64.rpm
# 执行
/opt/zzjz-agent/bin/zzjz-agent

启动成功截图:

res

msi生成

windows首次运行jpackage命令也会报错:
==找不到 WiX 工具 (light.exe, candle.exe)==
从 https://wixtoolset.org 下载 WiX 3.或更高版本,然后将其添加到 PATH。
错误:类型 [null] 无效或不受支持
按照提示安装WiX最新版本即可
在此执行发现还是报错:

error1

查看tempDir目录,发现其下已经生成了镜像目录,多次尝试无果后将上图中的light命令摘出来手动执行一下:

light.exe -spdb -cultures:"en-us" -ext WixUtilExtension -out D:\jdk-14.0.1\bin\tempDir2\images\win-exe.image\zzjz-agent-1.0.msi -loc D:\jdk-14.0.1\bin\tempDir2\config\MsiInstallerStrings_en.wxl D:\jdk-14.0.1\bin\tempDir2\wixobj\main.wixobj D:\jdk-14.0.1\bin\tempDir2\wixobj\bundle.wixobj

虽然同样还是报错,但报错信息更详细了:

error2

可以看到报错信息主要是说code page的问题,且多次提到1252这个数字
网上查了下code page是个什么鬼,故事追朔到上古时期在Unicode编码方案问世之前,各个国家、民族为了用计算机记录并显示自己的字符,都在ASCII编码方案的基础上,设计了各自的编码方案;比如大名鼎鼎的GB2312、GBK就是中文专用的编码方案,所有这些各个国家和地区所独立制定的既兼容ASCII又互相不兼容的字符编码,微软统称为ANSI编码,比如ANSI规定ISO 8859-1字符集(即Latin-1字符集)的ANSI代码页1252,简体中文GB编码的代码页是936,这里我们看到了报错中一直出现的1252,打开D:\jdk-14.0.1\bin\tempDir2\config目录,查看以下这两个配置文件:
compare

然后我直接将MsiInstallerStrings_en.wxl中的1252改成936后在此执行light命令后就成功了,具体为什么或者还有其他办法我也不深究了,而且这应该是WiX软件自身的bug,我在linux上用用jpackage就没这个问题,那为什么这么明显的bug还没修复??
最后附上生成的msi安装文件截图,直接双击安装即可:
success

参考:
A Guide to jpackage in Java 14
JDK14打包工具jpackage的使用
刨根究底字符编码之七——ANSI编码与代码页

# # # #
首页      编程经验      Java      使用jdk14的jpackage将springboot项目打包成msi和rpm

方块糖的工坊

使用jdk14的jpackage将springboot项目打包成msi和rpm
准备Jar 首先新建一个springboot工程,并为其添加一个测试接口,代码如下: @RestController @RequestMapping("/ag") public class AgentController { @GetMapping("/sayHello…
扫描二维码继续阅读
2020-05-20