当前位置: 首页 > wzjs >正文

网站定制案例辽宁建设工程信息网联合体投标

网站定制案例,辽宁建设工程信息网联合体投标,网站商城与网站区别,现代网站开发建设SpringBoot3.0 GraalVM21 Docker 打包成可执行文件 前言 随着时代的飞速发展,JDK 17 及以上版本开始支持通过 GraalVM 将运行在 JVM 上的 jar 包直接打包成可在操作系统上运行的原生可执行文件。这一特性能使开发者在某些场景下更加灵活地部署 Java 程序。 在云原…

SpringBoot3.0 +GraalVM21 + Docker 打包成可执行文件

前言

随着时代的飞速发展,JDK 17 及以上版本开始支持通过 GraalVM 将运行在 JVM 上的 jar 包直接打包成可在操作系统上运行的原生可执行文件。这一特性能使开发者在某些场景下更加灵活地部署 Java 程序。


云原生时代的背景下,Java 语言引以为傲的“一次编译,处处运行”的传统优势,似乎已逐渐不再成为关键竞争点。当前,通过 Docker 等容器化工具,我们可以轻松将应用环境和程序打包为镜像,再借助 Kubernetes 等编排工具高效部署和运行。这种方式使得 Java 的传统跨平台特性在现代云环境中已被进一步抽象化。


然而,GraalVM 带来的原生可执行文件能力为 Java 打开了新局面。不依赖 JVM,即可将程序以原生形式在目标操作系统上运行,这不仅显著提升了启动速度,还极大降低了运行时成本。这一优势为开发者提供了一种更加轻量化、高效的运行方式,是云原生场景下优化 Java 应用的重要工具。

SpringBoot3.0

SpringBoot3.0将最低的JDK版本变为17,自然后续的更新也支持了GraalVM的打包功能,所以我们进行服务端开发的时候可以直接利用SpringBoot集成的打包方式来快速打包成可执行文件。

docker

利用dockerfile明确运行环境和自动进行打包方式的执行可以做到另一种“跨平台”。

具体操作

初始化SpringBoot3.0的服务

进入start.spring.io
springboot项目初始化界面
我们先初始化好一个3.0的项目,注意右侧的依赖要加上插件GraalVM-native的支持
初始化完毕后我们可以得到如下项目的pom,核心是GraalVM的maven插件支持

<build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

构建一个接口用于服务启动后的功能测试
在这里插入图片描述

maven插件查看

此时我们观察右侧的maven插件位置,如果使用的是IDEA则直接根据图片中的顺序执行即可得到可执行的二进制文件。
idea执行顺序
当然了,由于我们后续还要编写dockerfile,所以直接使用工具难免不知道具体的命令是什么,所以我们可以一点一点的用命令行来执行

# 打包操作
mvn clean compile package
# springboot:aot操作
mvn spring-boot:process-aot 

aot操作完成后我们会发现在target目录下多了一堆奇奇怪怪的文件。

由于Java是一种动态语言,像SpringBoot很多地方都用到了反射,在进行GraalVM的native打包之前需要明确哪些是反射的类进行静态编译,具体可以去官网了解一下。

aot的结果

正式打包

好,我们继续开始native-image的打包:

mvn -DskipTests native:compile

打包过程会比较漫长,大家以前应该都写过诸如C、C++、rust等需要编译的语言,所以请大家耐心等待。
native-image日志
我们会发现似乎我们未来的可执行文件是Serial GC。
成功结果
看到上面的画面基本上就是打包成功了,并且我们会发现可执行文件在/target目录下,于是我们直接开始执行:

cd target
./test-graalvm

启动成功,观察到监听的端口是8080
native启动
发现这个unix可执行文件可不小啊
文件大小
请求一下接口发现请求成功
请求接口

编写dockerfile来进行CI/CD

云原生时代,我们直接利用docker进行跨平台操作。

明确编译期间的镜像

我们希望将java程序打包成可执行文件可以利用官网提供的docker镜像
官网graalvm + linux环境镜像的地址
当然我们进入地址后要注意观察下面几个文字:

  1. 21.0.0代表是GraalVM21版本
  2. ol9代表运行的环境是oraclelinux:9-slim (伏笔)
    在这里插入图片描述
    在docker上执行命令
docker pull ghcr.io/graalvm/graalvm-community:21.0.2-ol9-20240116

我们下载到这个包含了native-image的运行底层库运行环境jdk21环境的镜像后,还需要做一件事,因为我们程序是基于maven进行构建的,所以我们需要基于该镜像构建一个带有maven的镜像,所以受累我们要先写一个构建环境的dockerfile。

# 使用 GraalVM 官方镜像为基础
FROM ghcr.io/graalvm/graalvm-community:21.0.2-ol9-20240116
# 设置 Maven 的版本和相关路径
ENV MAVEN_VERSION=3.9.9
ENV MAVEN_HOME=/usr/share/maven
ENV PATH=$MAVEN_HOME/bin:$PATH
# 安装 Maven
RUN curl -fsSL https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz \| tar -xz -C /usr/share && mv /usr/share/apache-maven-${MAVEN_VERSION} /usr/share/maven
# 验证 Maven 和 GraalVM 的 native-image
RUN java -version && mvn --version && native-image --version
# 设置工作目录
WORKDIR /app
# 将自定义的 settings-pdk.xml 替换为 Maven 的用户级配置 settings.xml
COPY ./settings-pdk.xml /root/.m2/settings.xml
# 选择默认启动命令(可选)
CMD ["bash"]

这里我们选择的maven版本是3.9,9,同时里面有一句

COPY ./settings-pdk.xml /root/.m2/settings.xml

这个目的是将我本地的settings.xml替换掉默认的xml,避免由于一些特殊原因拉不到镜像的情况。

settings-pdk.xml的文件位置一定要和Dockerfile同级,否则可能会找不到
执行如下命令构建新的镜像

docker build -t pdk-graalvm21-ol9-20240116-mvn3.9.9 .

构建一个镜像出来,注意后面还有一个 " . "
当然也可以直接去我的仓库下载(我不知道能不能直接下载到)

docker pull speaive/pdk-graalvm21-ol9-20240116-mvn3.9.9:latest
开始编写编译的dockerfile

我们本地想必一定已经有了该镜像了,那我们基于刚才利用maven的一揽子操作来写一个打包的DockerFile吧
根目录下创建一个Dockerfile文件
创建好dockerfile

FROM pdk-graalvm21-ol9-20240116-mvn3.9.9 AS build# 设置工作目录
WORKDIR /appCOPY . .# clean + package
RUN mvn clean compile packageRUN mvn install
# 执行AOT编译
RUN mvn spring-boot:process-aot
# 执行native-image编译
RUN mvn -DskipTests native:compile
# 切换工作目录到target下
WORKDIR /app/target
# 指定端口是808
EXPOSE 8080
CMD ["/app/target/test-graalvm"]

直接执行一下

 docker build -t test-graalvm-image .

看到执行结束后出现的新的镜像
新的镜像
当然我们观察镜像会发现一个离谱的事

居然1.25G
这也太大了

因为我们把GraalVM和maven等工具链都打包到里面了,所以为了瘦身,我们只需要保留基础的oraclelinux:9-slim即可。

# ==========================================================
# 第一阶段:基于现有基础镜像完成 Maven 构建和 GraalVM 编译 (Build Stage)
# ==========================================================
FROM pdk-graalvm21-ol9-20240116-mvn3.9.9 AS build# 设置工作目录
WORKDIR /appCOPY . .RUN cat /root/.m2/settings.xml# clean + package
RUN mvn clean compile packageRUN mvn install# 执行AOT编译
RUN mvn spring-boot:process-aot# 执行native-image编译
RUN mvn -DskipTests native:compile# ==========================================================
# 第二阶段:精简运行环境 (Runtime Stage)
# ==========================================================
FROM oraclelinux:9-slim AS runtime# 设置工作目录
WORKDIR /app# 将构建阶段的原生可执行文件复制到运行镜像
COPY --from=build /app/target/test-graalvm /app/test-graalvm# 确保可执行文件有运行权限
RUN chmod +x /app/test-graalvm# 暴露服务使用的端口
EXPOSE 8082# 设置启动命令(运行原生二进制文件)
CMD ["/app/test-graalvm"]

执行完毕后发现镜像大小变小了
小镜像

tips:绑定端口的时候记得看一眼配置文件的端口是啥,别对不上到时候connect-refuse了

查看执行日志和结果
我绑的8082
在这里插入图片描述
执行结果
在这里插入图片描述
完结撒花


文章转载自:

http://cZL64Jy3.bfrsr.cn
http://WslpR9DP.bfrsr.cn
http://WmjAVws2.bfrsr.cn
http://tv4kFLHc.bfrsr.cn
http://0VnpB2Ok.bfrsr.cn
http://CB4x08EK.bfrsr.cn
http://86DQN441.bfrsr.cn
http://QnQLQhh2.bfrsr.cn
http://C59rGYgH.bfrsr.cn
http://RdIwKega.bfrsr.cn
http://KAThJHE2.bfrsr.cn
http://uzntqXZi.bfrsr.cn
http://ZkVXXKLK.bfrsr.cn
http://pZ93V3Aw.bfrsr.cn
http://t8xqpGMk.bfrsr.cn
http://Y5QAveuf.bfrsr.cn
http://xUSagerj.bfrsr.cn
http://lDN32cjO.bfrsr.cn
http://HFlXFtj3.bfrsr.cn
http://eiA8XcWV.bfrsr.cn
http://0Nud9qH2.bfrsr.cn
http://VHmvkkpp.bfrsr.cn
http://cLgBHd9x.bfrsr.cn
http://C12Q8cBP.bfrsr.cn
http://xCtdr9N2.bfrsr.cn
http://jE9pcPo9.bfrsr.cn
http://vVQubN0D.bfrsr.cn
http://MNI9Frqi.bfrsr.cn
http://E9svVIFW.bfrsr.cn
http://HhzeHuPD.bfrsr.cn
http://www.dtcms.com/wzjs/714367.html

相关文章:

  • 网站的目录结构学网站建设多久能学会
  • 编程教学网站推荐网站建设哈尔滨
  • 外贸网站推广公司手机网站比例尺寸
  • 中国网站优化哪家好做网站运营工资是不是很低
  • 网站建设公司美工如何找网站被黑能查到是谁做的吗
  • 电商网站的成本网站备案核验点
  • 郑州网站建设中心企业网站设计方案
  • 深圳住房和建设局网站认租申请揭阳模板网站建站
  • 漯河网站推广哪家好工业产品设计工资
  • 哪个网站做民宿更好呢诸城市网站建设
  • logo素材网站有哪些网站建设联雅
  • 南漳做网站软件技术专业主要学什么
  • 做设计网站的工作怎么样网站建设调研文档
  • 莆田哪里有网站开发国外有哪些设计网站有哪些问题
  • 邢台做网站费用wordpress 文章回收站
  • 网站建设管理规范iis的网站登录没反应
  • 设计网站免费下载网站设计网站机构
  • 双鸭山网站建设公司怎么把网站放到百度
  • 网站建设合同印花税税率wordpress段子主题
  • 长春网站网站推广公司设计广东手机网站制作价格
  • 膳食管理东莞网站建设wordpress修改后台
  • 做网站哪些软件解除网站开发合同 首付款是否退
  • 网站开发工具有组合东莞专业网络营销公司
  • 网站后台管理系统下载网站生成手机站
  • 重要的网站建设做测评的网站
  • 网站镜像 动态acg的wordpress主题
  • 上海网站建设公司页溪网络滁州项目建设公示在哪个网站
  • 做好公众号 网站建设山东知名网络传媒有限公司
  • 服装网站设计自己怎么做百度网站空间
  • 网站查询服务器2023网络舆情案例分析