目录:

1.前言

2.瘦身前的Jar包

3.解决方案

一、前言

SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。

这个时候如果想要对线上运行工程有一些微调,则打包部署非常痛苦。

二、瘦身前的Jar包

Tomcat在部署Web工程的时候,可以进行增量更新,SpringBoot也是可以的。

SpringBoot编译出来的Jar包中,磁盘占用大的,大部分是一些外部依赖库(jar包), 进入项目工程根目录,执行 mvn clean package 命令,得到的Jar包,用压缩软件打开,目录结构如下:

整个Jar包 66.6 MB, 但是 BOOT-INF/lib 就占用了将近 66.4 MB。

三、解决方法

步骤1: 正常编译JAR包,解压出lib文件夹

POM文件如下:

<build>
<plugins>
<!--这个插件是将所有的包打在一起-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!-- 这个插件主要是对打的包解压到dependency目录下 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<!-- 根据 dockerfile 构建镜像的mvn插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.9</version>
<configuration>
<!-- 镜像名 -->
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<!-- tag:默认使用当前版本 -->
<tag>${project.version}</tag>
</configuration>
</plugin>
</plugins>
<!--资源文件拷贝-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</build>

进入项目根目录,执行命令:mvn clean package ,将编译后的Jar包解压,拷贝 BOOT-INF 目录下的lib文件夹 到目标路径。

步骤2: 修改pom.xml配置,编译出不带 lib 文件夹的Jar包

<build>
<plugins>
<!--这个插件是将所有的包打在一起-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.zsm.JDApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
<plugin>
<!-- 这个插件主要是对打的包解压到dependency目录下 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<!-- 根据 dockerfile 构建镜像的mvn插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.9</version>
<configuration>
<!-- 镜像名 -->
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<!-- tag:默认使用当前版本 -->
<tag>${project.version}</tag>
</configuration>
</plugin>
</plugins>
<!--资源文件拷贝-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</build>

配置完成后,再次执行编译:mvn clean package ,生成的 Jar 包体积明显变小,如下所示, 外部的 jar 包已经不会被引入了:

步骤3: 运行编译后的Jar包

将 步骤1 解压出来的lib文件夹、步骤2编译的jar包放在同一个目录, 运行下面命令:

java -Dloader.path=D:/test/lib -jar D:/test/jenkins-docker-1.0-SNAPSHOT.jar

或者在maven中输入一下命令导出需要用到的jar包

mvn dependency:copy-dependencies -DoutputDirectory=D:/test/lib -DincludeScope=runtimme

备注:

将 D:/test/ 改成实际的路径。

-Dloader.path=lib文件夹路径

最终目录文件结构是:

lib     #lib 文件夹
jenkins-docker-1.0-SNAPSHOT.jar #jar包

说明

1、通常,一个工程项目架构确定后,引入的jar包基本上不会变,改变的大部分是业务逻辑,如果pom依赖发生了变化,必须替换原来的 lib 依赖文件;

2、后面如果需要变更业务逻辑,只需要轻量地编译工程,大大提高项目部署的效率。

参考:https://mp.weixin.qq.com/s/8gWrYfAfkZ7KoFkhg6ZWvA

SpringBoot 部署:外置依赖包的更多相关文章

  1. 最简单的方式离线部署Python依赖包

    最简单的方式离线部署Python依赖包 SHOW ME CODE! 打包: $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) $ pip wheel -r re ...

  2. SpringBoot之打成war包部署到Tomcat

    正常情况下SpringBoot项目是以jar包的形式,正常情况下SpringBoot项目是以jar包的形式,并且SpringBoot是内嵌Tomcat服务器,所以每次重新启动都是用的新的Tomcat服 ...

  3. node应用线上部署时锁定包的依赖版本

    npm shrinkwrap 我们使用node开发时,经常需要依赖一些模块来完成功能需求,而我们所依赖的模块也必然会依赖其他模块,就这样一级一级的依赖,而且这些依赖模块并不为我们所控制.一个产品或项目 ...

  4. 【转】Mapreduce部署与第三方依赖包管理

    Mapreduce部署是总会涉及到第三方包依赖问题,这些第三方包配置的方式不同,会对mapreduce的部署便捷性有一些影响,有时候还会导致脚本出错.本文介绍几种常用的配置方式: 1. HADOOP_ ...

  5. Python基于Flask框架配置依赖包信息的项目迁移部署小技巧

    一般在本机上完成基于Flask框架的代码编写后,如果有接口或者数据操作方面需求需要把代码部署到指定服务器上. 一般情况下,使用Flask框架开发者大多数都是选择Python虚拟环境来运行项目,不同的虚 ...

  6. Mapreduce部署与第三方依赖包管理

    Mapreduce部署是总会涉及到第三方包依赖问题,这些第三方包配置的方式不同,会对mapreduce的部署便捷性有一些影响,有时候还会导致脚本出错.本文介绍几种常用的配置方式: 1. HADOOP_ ...

  7. 为什么在SpringBoot+maven的项目中,所引入的依赖包可以不指定依赖的版本号?

    当在Springboot项目中引入了spring-boot-starter-parent,则可以不用引入依赖包版本号,比如: <parent> <groupId>org.spr ...

  8. springboot项目部署(war包)

    将springboot项目打包成war,并且部署到tomcat.比较麻烦,自己踩的坑也比较多.算了一下,找bug的时间,有两天熬到凌晨2点. 修改pom.xml使得打包成war <groupId ...

  9. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  10. springboot项目实现jar包外配置文件管理

    背景 为实现快速搭建和开发,项目以Springboot框架搭建,springboot搭建的项目可以将项目直接打成jar包并运行,无需自己安装配置Tomcat或者其他服务器,是一种方便快捷的部署方式. ...

随机推荐

  1. 史上最全memcached面试26题和答案

    Memcached是什么? Memcached是一个开源的,高性能的内存绶存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思. Memcached的作用? Memcached的作用:通 ...

  2. 基于Hexo实现一个静态的博客网站

    原文首发:https://blog.liuzijian.com/post/8iu7g5e3r6y.html 1.初始化Hexo Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目,旨 ...

  3. 某教育网站疑似删库。。。没备份。。。数据全没了。。。Sealos 带你一分钟满血复活

    2025 年 1 月 15 日,微信群里有人爆料,某教育网站疑似删库,导致网站无法访问.具体的问题是数据库被格式化了,而且也没有备份,连数据库表结构都没有,不仅业务瘫痪,也无法拉起新的应用,实在是有点 ...

  4. Apache Camel系列(1)----使用场景

    Apache Camel是一个基于Enterprise Integration Pattern(企业整合模式,简称EIP)的开源框架.EIP定义了一些不同应用系统之间的消息传输模型,包括常见的Poin ...

  5. Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

    Cut:AC 自动机简单题. 思路 看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机. 那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度.这个在字典树 insert ...

  6. Java中的输出格式化

    在Java中,输出格式化是一个非常重要的功能,尤其是在需要精确控制输出格式的场景下. 以下是对代码中输出部分的详细解释: 原代码中的输出: System.out.printf("%.6f\n ...

  7. 使用 Git 命令和 Github 前须了解的知识

    本文不包括 Git 命令的介绍与使用,只分享 Git 的关键概念与 Github 项目的基本工作流程.作者相信先了解它们对后续的学习和工作大有裨益.(如有错误和建议请大家评论告知) 版本控制系统 VC ...

  8. 赛博朋克2077/Cyberpunk 2077 v2.1|整合DLC|容量96.9GB|官方简体中文

    <赛博朋克2077>是知名<巫师>系列开发商CD PROJEKT RED公布的一款角色扮演游戏,故事设定在黑暗的.科技极度发达的腐败未来世界中,并且兼有沙盒元素与RPG机制.游 ...

  9. Codeforces Round 1006 (Div. 3) 补题+题解

    A. New World, New Me, New Array 贪心的想每次都赋值一个 \(p\) 如果正好和为 \(k\) 则答案就是 \(k/p\) ,否则是 \(k/p+1\). #includ ...

  10. 再谈Mysql undo log, redo log与binlog

    一.undo log 1.undo log有两个作用 提供回滚和多个行版本控制(MVCC). 在数据修改的时候,不仅记录了redo log,还记录了对应的undo,如果因为某些原因事务失败而回滚,可以 ...