前言
最近有一个小项目,没有历史包裹,直接使用最新的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/
目录下,可以查看日志文件内容。