经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » Maven » 查看文章
Spring Native打包本地镜像,无需通过Graal的maven插件buildtools
来源:cnblogs  作者:南瓜慢说  时间:2023/2/1 12:12:35  对本文有异议

简介

在文章《GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动》中,我们介绍了如何使用Spring Native和buildtools插件,打包出本地镜像,也打包成Docker镜像。本文探索一下,如果不通过这个插件来生成镜像。这样我们可以控制更多、了解更多。

创建Spring Boot项目

创建Spring Boot项目,引入Spring Native,我们主要使用的是Spring Native提供的AOT功能。如下:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.experimental</groupId>
  4. <artifactId>spring-native</artifactId>
  5. <version>${spring-native.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. </dependencies>
  12. <build>
  13. <plugins>
  14. <plugin>
  15. <groupId>org.springframework.experimental</groupId>
  16. <artifactId>spring-aot-maven-plugin</artifactId>
  17. <version>${spring-native.version}</version>
  18. <executions>
  19. <execution>
  20. <id>test-generate</id>
  21. <goals>
  22. <goal>test-generate</goal>
  23. </goals>
  24. </execution>
  25. <execution>
  26. <id>generate</id>
  27. <goals>
  28. <goal>generate</goal>
  29. </goals>
  30. </execution>
  31. </executions>
  32. </plugin>
  33. </plugins>
  34. </build>

Build image的时候,我们需要引用依赖库,所以加上下面的插件:

  1. <plugin>
  2. <artifactId>maven-dependency-plugin</artifactId>
  3. <executions>
  4. <execution>
  5. <phase>package</phase>
  6. <goals>
  7. <goal>copy-dependencies</goal>
  8. </goals>
  9. <configuration>
  10. <outputDirectory>${project.build.directory}/lib</outputDirectory>
  11. </configuration>
  12. </execution>
  13. </executions>
  14. </plugin>

接着先编译出Java class,命令如下:

  1. $ mvn clean package

打包本地镜像

前面的命令打包完,在target目录下会有一个lib目录,我们需要用上。通过native-image命令来生成镜像,如下:

  1. $ native-image -cp ./target/classes/:target/lib/* com.pkslow.springboot.SpringbootGraalVMNativeMain Pkslow.SpringbootGraalVMNativeMain

这样就会生成一个可执行文件:Pkslow.SpringbootGraalVMNativeMain

执行如下:

  1. $ ./Pkslow.SpringbootGraalVMNativeMain

使用了93ms来启动,还是很快的。

访问服务是正常的:

  1. $ curl -i http://localhost:8080/hi-graalvm
  2. HTTP/1.1 200
  3. Content-Type: text/plain;charset=UTF-8
  4. Content-Length: 67
  5. Date: Wed, 02 Nov 2022 15:08:44 GMT
  6. This message is from Spring Boot built/run by GraalVM/Spring Native

创建Docker镜像

先拉取基础镜像:

  1. $ docker pull springci/graalvm-ce:java11-0.12.x

进入容器看一下里面的状况:

  1. $ docker run -it --rm --entrypoint bash springci/graalvm-ce:java11-0.12.x
  2. root@d9b54bdce70a:/# pwd
  3. /
  4. root@d9b54bdce70a:/# java --version
  5. openjdk 11.0.15 2022-04-19
  6. OpenJDK Runtime Environment GraalVM 22.1.1.0-dev (build 11.0.15+10-jvmci-22.1-b06)
  7. OpenJDK 64-Bit Server VM GraalVM 22.1.1.0-dev (build 11.0.15+10-jvmci-22.1-b06, mixed mode, sharing)
  8. root@d9b54bdce70a:/# which java
  9. /opt/java/bin/java
  10. root@d9b54bdce70a:/# which native-image
  11. /opt/java/bin/native-image

准备一下Dockerfile如下:

  1. FROM springci/graalvm-ce:java11-0.12.x
  2. VOLUME /tmp
  3. ARG PORT=8080
  4. ARG TIME_ZONE=Asia/Shanghai
  5. ENV TZ=${TIME_ZONE}
  6. EXPOSE ${PORT}
  7. RUN pwd
  8. RUN mkdir /pkslow-application
  9. WORKDIR /pkslow-application/
  10. RUN cd /pkslow-application
  11. COPY target/classes/ /pkslow-application/classes/
  12. COPY target/lib/ /pkslow-application/lib/
  13. RUN native-image -cp /pkslow-application/classes/:/pkslow-application/lib/* com.pkslow.springboot.SpringbootGraalVMNativeMain Pkslow.SpringbootGraalVMNativeMain
  14. ENTRYPOINT ["/pkslow-application/Pkslow.SpringbootGraalVMNativeMain"]

打包Docker镜像:

  1. $ docker build . -t pkslow/spring-boot-native-without-buildtools:1.0-SNAPSHOT -f src/main/dker/Dockerfile

完成后通过下面命令启动,57ms完成启动:

  1. $ docker run -it -p 8080:8080 --rm pkslow/spring-boot-native-without-buildtools:0-SNAPSHOT
  2. 2022-11-02 23:48:40.918 INFO 1 --- [ main] o.s.nativex.NativeListener : AOT mode enabled
  3. . ____ _ __ _ _
  4. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v2.6.2)
  8. 2022-11-02 23:48:40.920 INFO 1 --- [ main] c.p.s.SpringbootGraalVMNativeMain : Starting SpringbootGraalVMNativeMain using Java 11.0.15 on 12528bd45fd7 with PID 1 (/pkslow-application/Pkslow.SpringbootGraalVMNativeMain started by root in /pkslow-application)
  9. 2022-11-02 23:48:40.920 INFO 1 --- [ main] c.p.s.SpringbootGraalVMNativeMain : No active profile set, falling back to default profiles: default
  10. 2022-11-02 23:48:40.934 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
  11. 2022-11-02 23:48:40.935 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
  12. 2022-11-02 23:48:40.935 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
  13. 2022-11-02 23:48:40.940 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
  14. 2022-11-02 23:48:40.940 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 19 ms
  15. 2022-11-02 23:48:40.963 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
  16. 2022-11-02 23:48:40.964 INFO 1 --- [ main] c.p.s.SpringbootGraalVMNativeMain : Started SpringbootGraalVMNativeMain in 0.057 seconds (JVM running for 0.061)
  17. 2022-11-02 23:48:57.098 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
  18. 2022-11-02 23:48:57.098 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
  19. 2022-11-02 23:48:57.098 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms

测试正常启动:

  1. $ curl -i http://127.0.0.1:8080/hi-graalvm
  2. HTTP/1.1 200
  3. Content-Type: text/plain;charset=UTF-8
  4. Content-Length: 67
  5. Date: Wed, 02 Nov 2022 15:49:05 GMT
  6. This message is from Spring Boot built/run by GraalVM/Spring Native

为了集成打包镜像到CI/CD中,在pom添加以下插件:

  1. <plugin>
  2. <groupId>org.codehaus.mojo</groupId>
  3. <artifactId>exec-maven-plugin</artifactId>
  4. <version>3.0.0</version>
  5. <executions>
  6. <execution>
  7. <phase>install</phase>
  8. <goals>
  9. <goal>exec</goal>
  10. </goals>
  11. <configuration>
  12. <skip>${docker.skip}</skip>
  13. <executable>docker</executable>
  14. <arguments>
  15. <argument>build</argument>
  16. <argument>.</argument>
  17. <argument>-t</argument>
  18. <argument>pkslow/${project.artifactId}:${project.version}</argument>
  19. <argument>-f</argument>
  20. <argument>src/main/docker/Dockerfile</argument>
  21. </arguments>
  22. </configuration>
  23. </execution>
  24. </executions>
  25. </plugin>

通过以下命令即可生成Docker镜像:

  1. $ mvn clean install -Ddocker.skip=false

代码

代码请看GitHub: https://github.com/LarryDpk/pkslow-samples

原文链接:https://www.cnblogs.com/larrydpk/p/17082128.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号