• SpringBoot 将 jar 包和 lib 依赖分离,dockerfile 构建镜像


    前言

    Spring Boot 是一个非常流行的 Java 开发框架,它提供了很多便利的功能,例如自动配置、快速开发等等。

    在使用 Spring Boot 进行开发时,我们通常会使用 Maven 或 Gradle 进行项目构建。

    本文将为您介绍如何使用 Maven 将 Spring Boot 项目打包成可执行的 JAR 文件,并将 JAR 文件和依赖库分离,以便于在 Docker 容器中部署。

    maven 依赖插件

    spring-boot-maven-pluginmaven-dependency-plugin 的 Maven 配置。

    spring-boot-maven-plugin 用于将 Spring Boot 应用程序打包为可执行的 JAR 或 WAR 存档文件,而 maven-dependency-plugin 用于将项目依赖项复制到指定位置。

    spring-boot-maven-plugin 被配置为将应用程序打包为可执行的 ZIP 存档文件。

    <plugin>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-maven-pluginartifactId>
        <configuration>
            <executable>trueexecutable>
            <layout>ZIPlayout>
            
            <jvmArguments>-Dfile.encoding=UTF-8jvmArguments>
            
            <includes>
                <include>
                    <groupId>nothinggroupId>
                    <artifactId>nothingartifactId>
                include>
            includes>
        configuration>
    plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    maven-dependency-plugin 被配置为将项目依赖项复制到 ${project.build.directory}/lib

    lib 依赖拷贝到 target 目录下

    
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-dependency-pluginartifactId>
        <executions>
            <execution>
                <id>copyid>
                <phase>packagephase>
                <goals>
                    <goal>copy-dependenciesgoal>
                goals>
                <configuration>
                    
                    <outputDirectory>
                        ${project.build.directory}/lib
                    outputDirectory>
                    <excludeScope>providedexcludeScope>
                configuration>
            execution>
        executions>
    plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    maven-jar-plugin 被配置为将项目打包为 JAR 文件,并将项目依赖项复制到 ${project.build.directory}/lib

    此外,maven-jar-plugin 还配置了 JAR 文件的 MANIFEST.MF 文件,其中包含了应用程序的主类和类路径,指定 jar 加载 lib 路径

    启动类需要填写你项目中的启动类

    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-jar-pluginartifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>top.teainn.project.MyApplicationmainClass>
                    <addClasspath>trueaddClasspath>
                    <classpathPrefix>lib/classpathPrefix>
                manifest>
            archive>
        configuration>
    plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    jar 包中的 META-INF 中的 MANIFEST.MF 中可以看到依赖前面有 lib/

    image-20231104105644791

    package 打包

    image-20231104104046348

    打包完成后,可以看到 jarlib 分离出来了

    image-20231104104122447

    Dockerfile 文件

    其中主要的是 COPY ${OUT_DIRECTORY}/lib /lib,将外部目录中的 lib 复制到容器中的 lib

    # 凉了的凉茶
    
    # 设置jdk版本
    FROM java:8
    
    # 设置我们的个人信息,大家根据需求随便写
    MAINTAINER daqi 
    
    # 这两行是设置我们容器内的时间以及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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    其他

    之后使用 Dockerfile 以及 docker-compose 部署项目可查看这篇博客

    使用 docker-compose 部署 SpringBoot 项目 & nginx 部署前端

  • 相关阅读:
    知识运维概述
    Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引
    微信小程序|自定义弹窗组件
    操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类
    web常见安全漏洞描述及解决方案
    C++拷贝构造函数
    另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国
    python毕业设计项目源码选题(4)企业公司网站系统毕业设计毕设作品开题报告开题答辩PPT
    教程图文详解 - 无线通信网(第五章)
    DocuWare 庆祝文档管理云解决方案推出10 周年
  • 原文地址:https://blog.csdn.net/weixin_62726289/article/details/134215719