前言
Spring Boot 是一个非常流行的 Java 开发框架,它提供了很多便利的功能,例如自动配置、快速开发等等。
在使用 Spring Boot 进行开发时,我们通常会使用 Maven 或 Gradle 进行项目构建。
本文将为您介绍如何使用 Maven 将 Spring Boot 项目打包成可执行的 JAR 文件,并将 JAR 文件和依赖库分离,以便于在 Docker 容器中部署。
maven 依赖插件
spring-boot-maven-plugin
和 maven-dependency-plugin
的 Maven 配置。
spring-boot-maven-plugin
用于将 Spring Boot 应用程序打包为可执行的 JAR 或 WAR 存档文件,而 maven-dependency-plugin
用于将项目依赖项复制到指定位置。
spring-boot-maven-plugin
被配置为将应用程序打包为可执行的 ZIP 存档文件。
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<layout>ZIP</layout>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!--这里是填写需要包含进去的jar,
必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
如果没有则nothing ,表示不打包依赖 -->
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
maven-dependency-plugin
被配置为将项目依赖项复制到 ${project.build.directory}/lib
。
将 lib
依赖拷贝到 target
目录下
xml
<!--拷贝依赖到jar外面的lib目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--指定的依赖路径-->
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
<excludeScope>provided</excludeScope>
</configuration>
</execution>
</executions>
</plugin>
maven-jar-plugin
被配置为将项目打包为 JAR 文件,并将项目依赖项复制到 ${project.build.directory}/lib
。
此外,maven-jar-plugin
还配置了 JAR 文件的 MANIFEST.MF
文件,其中包含了应用程序的主类和类路径,指定 jar
加载 lib
路径
启动类需要填写你项目中的启动类
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>top.teainn.project.MyApplication</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
在 jar
包中的 META-INF
中的 MANIFEST.MF
中可以看到依赖前面有 lib/
package 打包
打包完成后,可以看到 jar
和 lib
分离出来了
Dockerfile 文件
其中主要的是 COPY ${OUT_DIRECTORY}/lib /lib
,将外部目录中的 lib
复制到容器中的 lib
Dockerfile
# 凉了的凉茶
# 设置jdk版本
FROM java:8
# 设置我们的个人信息,大家根据需求随便写
MAINTAINER daqi <daqi_email@163.com>
# 这两行是设置我们容器内的时间以及jvm的时间(默认不是GMT)
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
#复制依赖 jar
COPY ${OUT_DIRECTORY}/lib /lib
# 前面的xxxxxx是我们上传的jar包名称,后面的是我们新命名的jar包
ADD Esurvey-backend-1.1.1.jar springboot.jar
# 执行我们的jar包,xxx是上面刚命名的新名字
# CMD java -jar springboot.jar
# 镜像启动成为容器后,对外暴露的端口
EXPOSE 9996
# Image创建容器时的初始化内存,最大内存,及启动时使用的profile. -c为清除以前启动的数据
# 依赖默认访问本目录下的 lib
ENTRYPOINT ["java","-Xms256m","-Xmx256m","-jar","/springboot.jar","--spring.profiles.active=prod","-c"]
其他
之后使用 Dockerfile 以及 docker-compose 部署项目可查看这篇博客