SpringBoot Jar包瘦身 - 跟大文件说再见!

前言

SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼、就是 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦

可以用以下方法减少jar内容

瘦身准备

1、首先我们要对Jar包有一个初步认识,它的内部结构如下

example.jar
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-BOOT-INF
    +-classes
    |  +-mycompany
    |     +-project
    |        +-YourClasses.class
 ? ?+-lib  // 依赖库的包
 ? ? ? +-dependency1.jar
       +-dependency2.jar

运行该Jar时默认从BOOT-INF/classes加载class,从BOOT-INF/lib加载所依赖的Jar包。如果想要加入外部的依赖Jar,可以通过设置环境变量LOADER_PATH来实现。

如此一来,就可以确认我们的思路了:

  1. 把那些不变的依赖Jar包(比如spring依赖、数据库Driver等,这些在不升级版本的情况下是不会更新的)从Flat Jar中抽离到单独的目录,如libs
  2. 在启动Jar时,设置LOADER_PATH使用上一步的libs
java -Dloader.path="libs/" -jar ht-ui-web.jar

这样,我们最终打包的jar包体积就大大减少,每次迭代后只需要更新这个精简版的Jar即可。

需要在pom文件配置忽略的依赖包。

  • 关键需要配置MANIFEST.MF 文件中加入lib路径。
  • 然后正常启动jar包就可以了。
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!--不打包资源文件-->
                    <!--<excludes>-->
                    <!--<exclude>*.**</exclude>-->
                    <!--<exclude>*/*.xml</exclude>-->
                    <!--</excludes>-->
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!--MANIFEST.MF 中 Class-Path 加入前缀-->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--jar包不包含唯一版本标识-->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!--指定入口类-->
                            <mainClass>com.XProApplication</mainClass>
                        </manifest>
                        <!--<manifestEntries>-->
                        <!--&lt;!&ndash;MANIFEST.MF 中 Class-Path 加入资源文件目录&ndash;&gt;-->
                        <!--<Class-Path>./resources/</Class-Path>-->
                        <!--</manifestEntries>-->
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>

完整pom文件的内容如下。。

配置完毕打包项目就会将lib包和项目包分开放到target中。然后分开上传内容。 ?以后就可以上传精简的jar包了

````

org.apache.maven.plugins
maven-compiler-plugin
3.1

org.apache.maven.plugins
maven-jar-plugin

true

lib/

false

com.XProApplication

${project.build.directory}

        <!--拷贝依赖 copy-dependencies-->
        <!--也可以执行mvn copy-dependencies 命令打包依赖-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            ${project.build.directory}/lib/
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!--spring boot repackage,依赖 maven-jar-plugin 打包的jar包 重新打包成 spring boot 的jar包-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖-->
                <includes>
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--使用外部配置文件,jar包里没有资源文件-->
                <addResources>true</addResources>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
                        <!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
                        <!--<classifier>run</classifier>-->
                    </configuration>
                </execution>
            </executions>
        </plugin>

</build>

```

原文地址:https://www.cnblogs.com/rolandlee/p/11295516.html

时间: 2024-08-30 07:39:00

SpringBoot Jar包瘦身 - 跟大文件说再见!的相关文章

springboot jar包运行中获取资源文件

1. 今天晚上写了一个程序,基于Spring boot的一个小网站,发现使用FileUtils.class.getResource(path)来获取jar包中的资源文件并不能成功,其路径很奇怪 file:/Users/lonecloud/Documents/ideaCode/git/export/target/export-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/temp/temp.xls 查阅资料后,并且查看jar包中的资源文件发现有!还有classes!这

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

java文件转成jar包再转成exe文件

[本文简介] 本文将介绍如何把一个跑在eclipse的java应用,导出成jar文件,再变成exe可执行文件. 下面以一个跑在MyEcplise上的GUI应用程序为例子,一步步转化成exe可执行文件. [具体步骤] 1.安装Fat jar(小应用可不用,直接导出普通jar包即可) 如果你在程序开发的时候用到了第三方提供的API或者其它附属资源,在你导出生成jar文件时你必须将第三方的文件一并导出,不然你的程序运行将达不到你想要的结果. 所以我们使用 Fat jar插件 来生成jar包: (1)F

SpringBoot系列之—瘦身部署

一.前言SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼: 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了. 这个时候如果想要对线上运行工程有一些微调,则非常痛苦, :( 二.瘦身前的Jar包Tomcat在部署Web工程的时候,可以进行增量更新,SpringBoot也是可以的- SpringBoot编译出来的Jar包中,磁盘占用大的,是一些外部依赖库(jar包),例

JAR包中的MANIFEST.MF文件详解以及编写规范

参考百度百科的解释如下: MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据.单词“manifest”的意思是“显示” 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-

如何编写jsp文件?何添加数据库jar包?如何把class文件与jsp文件联系起来?

一.如何添加数据库jar包? 1.首先进入当前的工作空间,例如:(我的工作空间是javaWeb) F:\javaWeb\Web\WebContent\WEB-INF\lib 然后进入到lib目录下,把jar包放到lib目录下. 2.然后右键项目:构建路径--配置构建路径--库--添加外部包--选择你要添加的jar包 二.如何创建与编写jsp文件? 1.创建jsp文件:在项目中右键WebContent,选择jsp File, 2.编写jsp文件: a. 首先我们要将jsp源码中的charset,p

Eclipse for javaee中开发web项目,jar包必须放到/WEB-INF/lib文件夹下

1.tomcat应用服务器,它有其自己的类加载器,根据J2EE的规范去%web-project%/WEB-INF/lib的路径去找相应的lib下的jar文件 2.使用eclipse javaee IDE时,会将WEB-INF/lib中所有的lib自动加入到library中 3.eclipse工程下的library是用来编译里面的src中java文件的,实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运行是找不到类 4.你

Eclipse插件开发 RCP生成jar包后获取jar包中的Plugin/Bundle文件资源——以FreeMarker为例

在进行Eclipse插件开发时,有一种应用场景是,需要在插件项目中设置存放有例如配置文件.模板文件的资源文件夹.本文介绍的问题是,插件项目打包发布后,无法访问资源文件夹中的资源文件. 问题重现: 在插件项目的根目录下有模板资源文件夹,需要在插件运行时访问这些资源.在插件开发中,通过"Run as -- Eclipse Application"方式测试插件,可以正常访问,但是生成jar包后发布运行,却无法定位到这些资源文件(表现为,指向该资源文件的URL对象为空). 问题代码(目的是插环

如何将Maven项目中引用的Jar包复制到一个lib文件夹中

Maven的非web项目在执行时需要引用很多jar包,这时候通常的做法是将这些jar包统一放到lib目录中,maven的dependency插件可以帮我们做这件事情. 我们需要在pom文件的build节点的plugins节点内添加一个plugin,plugin内容如下: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependen