SpringBoot打包优化

springboot项目打包优化,项目过程中会依赖其他很多jar包,如果打包太大,服务器网速不给力,上传服务器会很慢,此时可以对打包进行优化,增量部署,如果版本变化,需要重新上传依赖的jar到lib里面。所以如果每次都是全量,请忽略此文。

spring boot打瘦身包

方式一

1.在pom的 <plugins>标签下添加spring-boot-maven-plugin,该配置会在打包的时候把第三方lib排除

<plugin> 
  <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-maven-plugin</artifactId>  
  <configuration> 
    <!-- 指定该Main Class为全局的唯一入口 -->  
    <mainClass>com.xfw.community.MicroCommunityApplication</mainClass>  
    <!--把第三方jar包打入jar -->  
    <includeSystemScope>true</includeSystemScope>  
    <fork>true</fork>  
    <!-- 设置为ZIP,此模式下spring-boot-maven-plugin会将Manifest.MF文件中的Main-Class设置为org.springframework.boot.loader.PropertiesLauncher -->  
    <layout>ZIP</layout>  
    <includes> 
      <!--去除在生产环境中不变的依赖-->  
      <!--<excludeGroupIds>-->  
      <!--org.springframework.boot-->  
      <!--</excludeGroupIds>-->  
      <include> 
        <!-- 排除所有Jar -->  
        <groupId>nothing</groupId>  
        <artifactId>nothing</artifactId> 
      </include> 
    </includes> 
  </configuration>  
  <executions> 
    <execution> 
      <goals> 
        <goal>repackage</goal>
        <!--可以把依赖的包都打包到生成的Jar包中 --> 
      </goals> 
    </execution> 
  </executions> 
</plugin>

2.添加maven-dependency-plugin插件,把排除的lib复制出来放到编译后的target/lib目录

<!-- 分离lib,第一次分离后,后续可不用打包 -->
<plugin> 
  <!--这个插件就是把依赖的jar包复制出来放到编译后的target/lib目录,并且在打包时候排除内部依赖-->  
  <groupId>org.apache.maven.plugins</groupId>  
  <artifactId>maven-dependency-plugin</artifactId>  
  <executions> 
    <execution> 
      <id>copy-dependencies</id>  
      <phase>prepare-package</phase>  
      <goals> 
        <goal>copy-dependencies</goal> 
      </goals>  
      <configuration> 
        <outputDirectory>${project.build.directory}/lib</outputDirectory>  
        <overWriteReleases>false</overWriteReleases>  
        <overWriteSnapshots>false</overWriteSnapshots>  
        <overWriteIfNewer>true</overWriteIfNewer> 
        <includeScope>compile</includeScope>
      </configuration> 
    </execution> 
  </executions> 
</plugin>

3.把lib包和项目打出来的jar包放到服务器,启动时新增参数-Dloader.path=lib/,指定lib路径,完整启动命令如:

java -Dloader.path=lib/ -jar xxx.jar

方式二

1.使用maven-jar-plugin插件

更换maven的jar打包插件,先前使用的是spring-boot-maven-plugin来打包,这个插件会将项目所有的依赖打入BOOT-INF/lib下,替换为maven-jar-plugin

  • addClasspath表示需要加入到类构建路径
  • classpathPrefix指定生成的Manifest文件中Class-Path依赖lib前面都加上路径,构建出lib/xx.jar
<plugin> 
  <groupId>org.apache.maven.plugins</groupId>  
  <artifactId>maven-jar-plugin</artifactId>  
  <version>${maven.jar.plugin.version}</version>  
  <configuration> 
    <archive> 
      <manifest> 
        <addClasspath>true</addClasspath>  
        <classpathPrefix>lib/</classpathPrefix>  
        <mainClass>com.xxx.Start</mainClass> 
      </manifest> 
    </archive> 
  </configuration> 
</plugin>

2.拷贝依赖到jar外面的lib目录(和方式一的步骤2一致)

3.此时把jar包和lib包放到服务器同一级目录下即可启动(无需指定lib目录了)

java -jar xxx.jar

使用外部的application.yml

有时候我们只改动配置文件,不想重新打包,可以使用外部的application.yml文件

1.在和jar包同级的目录下新建一个config目录,放入application.yml文件

这里不用打包的jar里面的application.yml文件而用外部的application.yml文件,因为boot读取配置有一个优先级,放在jar包外面config目录优先级最高,主要是便于从外部修改配置,而不是改jar包中的application.yml文件。优先级如下:

  • 当前目录的config目录下
  • 当前目录
  • classpath的config目录下
  • classpath的根目录

2.注意一个依赖的坑

我多次通过java -jar的方式启动项目总是报如下错误:

ClassNotFoundException: org.springframework.boot.SpringApplication

后来发现时一个依赖的问题,问题详情可以见这个博客:
SpringBoot使用yaml作为配置文件之坑

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.21</version>
</dependency>

3.启动项目

这里不用在置顶lib的目录,并且加入–debug可以让你可以看到比较详细的启动日志

ava -jar xxx.jar --debug 

全自动化步骤

前面介绍的步骤中,需要手动的拷贝application.yml文件,并且jar包内外都存在配置,总感觉怪怪的。这里引入一种自动化配置,将所有东西打成zip文件,直接发布到服务目录,解压后,即可启动。

1.还是同上面方法二的步骤1,2所示,指定打包插件和拷贝依赖的插件。

2.排除resources下面的yml(因为我们需要把它放在jar外部,不能让jar打包插件将其打入jar包classpath下去)

<resources> 
  <resource> 
    <directory>src/main/resources</directory>  
    <excludes> 
      <exclude>**/application.yml</exclude> 
      <<!---->exclude>**/*.yml</exclude> 
    </excludes> 
  </resource> 
</resources>

上面这种排除*.yml配置文件的办法,有可能会在IDEA编译器启动的时候报错,下面的排除方法不会引起报错:(二选一即可)

<plugin> 
  <groupId>org.apache.maven.plugins</groupId>  
  <artifactId>maven-jar-plugin</artifactId>  
  <configuration> 
    <archive> 
      <manifest> 
        <addClasspath>true</addClasspath>  
        <classpathPrefix>lid/</classpathPrefix>  
        <mainClass>com.xxx.Start</mainClass> 
      </manifest> 
    </archive>  
    <!-- 排除配置文件 -->  
    <excludes> 
      <exclude>*.yml</exclude> 
    </excludes> 
  </configuration> 
</plugin>

3.使用maven-assembly-plugin自定义打包

具体打包详情在assembly.xml配置中指定

<plugin> 
  <artifactId>maven-assembly-plugin</artifactId>  
  <configuration> 
   <!-- 打包后的包名是否包含assembly的id名 -->
    <appendAssemblyId>false</appendAssemblyId>  
    <!-- 指定最后tar或者zip包的名字 -->
    <finalName>packageName</finalName>
    <descriptors> 
    <!-- 引用的assembly配置文件,可以用多个,即可以同时打包多个格式的包 -->
      <descriptor>src/main/resources/assembly.xml</descriptor> 
    </descriptors> 
  </configuration>  
  <executions> 
    <!-- phase加入package后,则在执行maven package时就可以调用maven-assembly-plugin插件定义的打包方式 -->
    <execution> 
      <!--名字任意 -->
      <id>make-assembly</id>  
      <!-- 绑定到package生命周期阶段上 -->
      <phase>package</phase>  
      <goals> 
        <!-- 只运行一次 -->
        <goal>single</goal> 
      </goals> 
    </execution> 
  </executions> 
</plugin>

assembly.xml具体配置如下:

  • 将application.yml放在外部config目录下
  • 所有依赖打成zip压缩包
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${basedir}/src/main/resources</directory>
            <includes>
                <include>*.yml</include>
            </includes>
            <filtered>true</filtered>
            <outputDirectory>${file.separator}config</outputDirectory>
        </fileSet>

        <fileSet>
            <!-- 需要打包的路径 -->
            <directory>src/main/resources/runScript</directory>
            <!-- 打包后输出的路径,自定义 -->
            <outputDirectory>${file.separator}bin</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>${file.separator}lib</outputDirectory>
            <includes>
                <!-- 打包需要包含的文件 -->
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>${file.separator}</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

4.解压zip,启动

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
【资源说明】 1、基于SpringBoot和Vue的餐馆点餐系统源码+数据库+项目说明(毕设).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringBoot和Vue的餐馆点餐系统源码+数据库+项目说明(毕设).zip # RestaurantOrder 基于SpringBoot和Vue的餐馆点餐系统 ## QuickStart ### 后端 1. 预先准备mysql,数据库名称为restaurant - restaurant.sql 2. 修改配置文件数据库账号密码 `src/main/resources/application-template.yaml` 3. 运行RestaurantApplication.java ### 前端 ```shell # npm/yarn安装依赖 npm install # 运行 npm run serve # 编译 npm run build ``` ### 访问 http://localhost:8080/ 默认账号密码 1. 管理员 Peggy : 123456 2. 普通用户 Ikaros : 123456 管理员多了可以添加菜单的功能 ## 功能说明-后端 ### 接口文档 采用Swagger2,启动后访问127.0.0.1/swagger-ui.html,默认端口80 ### 数据库 mysql 使用SpringJPA交互 ### 身份校验 登陆:取出数据库用户,对上传的密码进行MD5加密,比较是否相同 Session进行身份标识,默认30m过期 ### 权限校验 用三个注解配合Aspect使用 #### IsOwner 标识参数中的UserId是否与当前登录用户一致 #### NeedAdmin 是否需要管理员权限,管理员的type为1,普通用户为0 #### PreAuthorize SpEL表达式,可以自定义自己的权限验证方法,用于复杂校验 ### 异常统一处理 用ControllerAdvice拦截自定义异常 错误代码都存放在CommonCodeEnum ### Docker 默认不开启打包成Docker,如果要开启,在pom.xml下`dockerfile-maven-plugin`插件中取消注释`<goal>build</goal>` DockerFile中以`openjdk:8-jdk-alpine`为基础镜像以减少打包后的体积 请自行修改pom.xml中docker相关参数,比如镜像名称与标签 ```shell docker run --name restaurant -p 8888:80 -d --restart=always 镜像名称 ``` ## 功能说明-前端 前端不是很熟悉,这里就简单介绍一下 ### 优化 cdn ### 拦截器 axios设置拦截器拦截响应,如果session过期则重新登录 ### 配置 #### API `src/base/config/system.js`里的apiUrl 所有的请求是基于这个apiUrl来拼接的
文档内容 一、 Spring介绍 1 1.1、SpringBoot简介 1 1.2、系统要求: 1 1.3、SpringBootSpringMVC区别 1 1.4、SpringBootSpringCloud区别 2 1.5常见错误 2 二、快速入门 2 2.1、创建一个Maven工程 2 2.2、pom文件引入依赖 3 2.3、编写HelloWorld服务 3 2.4、@RestController 4 2.5、@EnableAutoConfiguration 4 2.6 SpringApplication.run(HelloController.class, args); 4 2.7、SpringBoot启动方式1 4 2.8、SpringBoot启动方式2 4 2.9、SpringBoot启动方式3 5 三、 Web开发 5 3.1、静态资源访问 5 3.2、渲染Web页面 5 3.3、使用Freemarker模板引擎渲染web视图 6 3.3.1、pom文件引入: 6 3.3.2、后台代码 6 3.3.3、前台代码 6 3.3.4、Freemarker其他用法 7 3.3.5、Freemarker配置 8 3.4、使用JSP渲染Web视图 8 3.4.1、pom文件引入以下依赖 8 3.4.2、在application.properties创建以下配置 9 3.4.3、后台代码 9 3.5、全局捕获异常 10 四、 数据访问 10 4.1、springboot整合使用JdbcTemplate 10 4.2、springboot整合使用mybatis 12 4.3、springboot整合使用springjpa 18 4.4、springboot整合多数据源 19 五、 事物管理 25 5.1.1SpringBoot整合事物管理 25 5.1.2SpringBoot分布式事物管理 25 六、 日志管理 30 6.1使用log4j记录日志 30 6.2使用AOP统一处理Web请求日志 32 6.3Spring Boot集成lombok让代码更简洁 33 七、 缓存支持 35 7.1注解配置与EhCache使用 35 7.2使用Redis集成缓存 37 八、 热部署 37 8.1 什么是热部署 37 8.2 项目演示案例 37 8.3 热部署原理 37 8.4 Devtools依赖 38 8.5 Devtools原理 38 九、 监控管理 38 Actuator监控应用 38 Maven依赖 38 YML配置 39 Actuator访问路径 40 Admin-UI分布式微服务监控中心 40 Admin-UI-Server 40 Admin-UI-Client 41 十、 性能优化 43 组件自动扫描带来的问题 43 将Servlet容器变成Undertow 44 SpringBoot JVM参数调优 44 十一、 2.0版本新特性 45 以Java 8 为基准 45 内嵌容器包结构调整 45 Servlet-specific 的server properties调整 45 Actuator 默认映射 46 Spring Loaded不再支持 46 支持Quartz Scheduler 46 OAuth 2.0 支持 46 支持Spring WebFlux 46 版本要求 46 十二、 其他内容 47 12.1、使用@Scheduled创建定时任务 47 12.2、使用@Async实现异步调用 47 12.3、自定义参数 49 12.4、多环境配置 50 12.5、修改端口号 50 12.6、SpringBoot yml 使用 50 12.7、SpringBoot整合拦截器 51 12.8、发布打包 52

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值