前言
最近有一个小项目,没有历史包裹,直接使用最新的spring native进行构建。 在打包的时候,遇到了很多坑,虽然打包成功,但是在运行时,还是报错,特此写一篇文章记录下来。
首先是项目配置
我这边使用的是最新的spring-boot版本3.3.2
1 | |
由于项目中使用了AWS的S3 SDK,所以需要添加依赖
1 | |
遇到的问题
本地打包成二进制启动报错
AWS SDK报错
1 | |
参考AWS的issueInternalConfig throws exception in runtime with native application,解决方法如下:
1 | |
这里要注意,com.amazonaws.http.conn.Wrapped 是私有接口,所以我这个类的包名和com.amazonaws.http.conn.Wrapped的包名要一致。
Mybatis-plus报错
解决办法参考SpringBoot3支持问题
1 | |
这里我项目没有使用Lambda表达式,所以没有修复Lambda表达式相关的问题。至此依赖都已解决。
打包运行报错
直接使用spring-boot打包运行
命令行运行 mvn clean package -Pnative 后,构建成native镜像 mvn spring-boot:build-image,然后运行 docker run -it --rm -v ./logs/:/workspace/logs/ --name my-app my-app:0.0.1-SNAPSHOT
由于项目使用了日志框架LogBack,用于自定义日志等级格式,此时启动时会报错,报错信息如下:
1 | |
这里一直提示权限不够,尝试修改文件权限为777后依旧无法解决,最后通过自定义Dockerfile文件手动打包解决
创建Dockerfile文件
1 | |
这里使用了Alpine镜像,并安装tzdata和libc6-compat,设置时区为Asia/Shanghai。
注意这里的libc6-compat是必需的,如果不安装,可能会出现应用启动失败,提示no-such-file-or-directory,当然,你也可以选择使用其他镜像。
构建镜像
1 | |
此时再次执行
1 | |
运行成功,日志文件生成在./logs/目录下,可以查看日志文件内容。