解决SpringBoot jar包太大的问题

spring boot添加spring-boot-maven-plugin插件后, 打出来的Jar动辄几十上百兆. 这种FatJar包在传输时会相当不便, 尤其是某些外企, 服务器可能在美国, 上传速度可能不到200K, 严重影响工作效率.

本文就说说怎样减少FatJar的大小.

SpringBoot的web应用一般都添加了spring-boot-maven-plugin插件.

Maven xml代码

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
        </plugin>  
    </plugins>  
</build>  

打出来的jar包内置了所有的依赖jar, 放在BOOT-INF/lib目录, 所以体积很大.

解决步骤:

  1. 修改spring-boot-maven-plugin的参数, 使其将内置的jar包exclude掉, 例如:

Xml代码

<plugin>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-maven-plugin</artifactId>  
   <version>1.5.1.RELEASE</version>  
   <configuration>  
      <layout>ZIP</layout>  
       <excludes>  
           <exclude>  
               <groupId>ch.qos.logback</groupId>  
               <artifactId>logback-classic</artifactId>  
           </exclude>  
           <exclude>  
               <groupId>com.google.guava</groupId>  
               <artifactId>guava</artifactId>  
           </exclude>  
       </excludes>  
   </configuration>  
</plugin>  

这样, 打出来的jar中就不会包含被exclude掉的依赖了.注意layout应设置为ZIP,不然后面会出现找不到类的错误.

exclude不止一种写法, 其他的exclude方式参见http://docs.spring.io/spring-boot/docs/current/maven-plugin/start-mojo.html.

可以通过mvn dependency:tree命令查看当前项目的依赖.

因为依赖的jar已经被排除掉了, FatJar变瘦, 直接运行就会报ClassNotFoundException. 所以还要进行下一步.

可以在公司的parent pom.xml的pluginManagement部分添加spring-boot-maven-plugin的配置, 这样每个web项目就可以继承一套全公司统一的配置.

  1. 将上一步exclude掉的jar放到一个外置的目录中. 如:
    在这里插入图片描述
    然后执行如下命令启动应用:

    Cmd代码

java -Dloader.path="lib/" -jar common-service.jar  
或
后台启动
nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 &


命令详解:

nohup:不挂断地运行命令,退出帐户之后继续运行相应的进程。

>日志文件名.log:是nohup把command的输出重定向到当前目录的指定的“日志文件名.log”文件中,即输出内容不打印到屏幕上,而是输出到”日志文件名.log”文件中。不指定文件名会在当前目录创建nohup.out,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。


2>&1:2就是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出么。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的“日志文件名.log”文件中。


java -jar 自己的springboot项目.jar:执行springboot的项目,如果单单只执行该命令,linux只会短暂的运行该项目,当退出控制台后会自动关闭该项目。


最后的&:让改作业在后台运行。

loader.path指向了外置目录,告诉springboot允许从外部加载依赖.

loader.path的更多用法参见:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching.

可以用mvn dependency:copy-dependencies命令将jar包copy到这个外置目录.

经测试, 经过上面的两个步骤, 笔者的应用从70MB缩小为1.3MB, 极大地缩小了体积.

既缩小了体积, 便于传输, 又很容易地控制依赖jar的版本, 做到全公司统一, 共享同一套依赖集合.

特别地, 如果要讲应用部署到docker中, 需要修改dockerfile, 将依赖目录挂载到docker镜像中, 修改应用的启动命令(可能会是dockerfile的entrypoint),添加loader.path参数, 指向挂载进来的依赖目录. 不建议将依赖ADD到docker镜像, 那样的话docker镜像会很大.​​​​

转载于:https://blog.youkuaiyun.com/m0_37598340/article/details/86149186

<think>嗯,用户想了解在Spring Boot中如何禁止Tomcat动态加载JAR。首先,我需要回忆一下Tomcat在Spring Boot中的工作方式。Spring Boot默认内嵌Tomcat,所以可能需要调整Tomcat的配置。 动态加载JAR通常指的是Tomcat在运行时从特定目录(比如WEB-INF/lib)加载JAR,这可能在生产环境中不太安全,或者用户希望禁用这种机制以防止未经许可的JAR被加载。用户的需求可能是出于安全考虑,或者为了优化启动性能。 接下来,我需要确定如何配置内嵌的Tomcat来禁止这个行为。在传统的Tomcat部署中,可以通过配置Context元素的allowLinking或deployXML属性来控制,但在Spring Boot中,可能需要通过自定义TomcatServletWebServerFactory来实现。 然后,我需要检查是否有相关的配置属性可以直接在application.properties中设置。不过,通常这些高级配置可能需要通过编程方式调整。比如,通过添加一个WebServerFactoryCustomizer bean,并修改Tomcat的Context。 另外,需要注意不同版本的Spring Boot可能会有不同的配置方法,所以需要确保提供的方法兼容大部分版本。可能还需要考虑Jar扫描的问题,比如Tomcat默认会扫描Jar中的Servlet等组件,禁用动态加载可能需要关闭这种扫描。 最后,确保给出的步骤清晰,括可能的配置代码示例,并提醒用户测试配置的有效性。同时,说明禁用后的影响,比如无法热加载JAR,需要重启应用等注意事项。</think>在Spring Boot中禁止Tomcat动态加载JAR,可以通过以下步骤实现: --- ### 一、问题背景 Tomcat默认支持动态加载`WEB-INF/lib`目录下的JAR文件,这在开发环境中便于调试,但在生产环境中可能带来安全隐患或资源消耗。Spring Boot通过内嵌Tomcat运行时,需要调整其默认行为。 --- ### 二、实现方案 #### 1. 禁用JAR文件扫描 通过配置Tomcat的`Context`禁用JAR扫描: ```java @Configuration public class TomcatConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() { return factory -> factory.addContextCustomizers(context -> { // 禁用JAR扫描 JarScanner jarScanner = new DisabledJarScanner(); context.setJarScanner(jarScanner); }); } // 自定义空JAR扫描器 static class DisabledJarScanner extends JarScanner { @Override public void scan(JarScanType scanType, Context context, JarScannerCallback callback) { // 空实现,跳过扫描 } } } ``` #### 2. 禁用动态部署功能 在`application.properties`中配置: ```properties # 禁止Tomcat自动部署 server.tomcat.background-processor-delay=-1 # 禁用MBean注册(可选) server.tomcat.mbeanregistry.enabled=false ``` --- ### 三、验证配置 1. 启动应用时观察日志,确认无`JarScanner`相关扫描输出 2. 尝试在`WEB-INF/lib`中添加新JAR,验证是否无法被加载 3. 通过JMX检查Tomcat的`JarScanner`状态(如果未禁用MBean) --- ### 四、注意事项 1. **兼容性**:适用于Spring Boot 2.x及以上版本 2. **副作用**:禁用后无法动态加载新JAR,需通过重启生效 3. **安全加固**:建议同时配置`server.tomcat.unauthorized-http-methods=TRACE,OPTIONS`等安全参数 --- 通过上述配置,可以有效地禁止Tomcat在Spring Boot应用中动态加载JAR,提升应用的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值