spirng boot 打包,胖fat包和瘦thin包

news2024/11/20 6:15:27

一、打胖包fat

打胖包采用的是spring的标准来执行,所以使用的是spring boot提供的打包插件

参考来源:打包Spring Boot应用 - 廖雪峰的官方网站

步骤

pom配置

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

打包命令

mvn clean package

target目录

$ ls
classes
generated-sources
maven-archiver
maven-status
springboot-exec-jar-1.0-SNAPSHOT.jar
springboot-exec-jar-1.0-SNAPSHOT.jar.original

其中,springboot-exec-jar-1.0-SNAPSHOT.jar.original是Maven标准打包插件打的jar包,它只包含我们自己的Class,不包含依赖,而springboot-exec-jar-1.0-SNAPSHOT.jar是Spring Boot打包插件创建的包含依赖的jar,可以直接运行:

执行

java -jar springboot-exec-jar-1.0-SNAPSHOT.jar

举例

                         <plugin>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-maven-plugin</artifactId>
                            <version>${spring-boot-dependencies.version}</version>
                            <executions>
                                <execution>
                                    <goals>
                                        <goal>repackage</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>

打包后的jar包解压后的文件目录

MANIFEST.MF文件

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: gymd
Start-Class: com.shenyun.flinkgui.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_321
Main-Class: org.springframework.boot.loader.JarLauncher

总结

打包后只有一个可以执行的jar文件,内部包含了配置,lib等(lib)

打包后使用``java -jar demo.jar``启动项目

demo.jar中有MF信息清单,有入口类的说明Main-class

spring boot项目的类入口Main-class为org.springframework.boot.loader.JarLauncher,这个是标准的java处理

另外有个Start-Class表示是项目上的入口类型,这个由spring boot来处理

二、打瘦包thin

使用plugin介绍

spring-boot-maven-plugin,得到主jar

maven-dependency-plugin,得到依赖包,lib/*.jar 文件

maven-assembly-plugin,组合主jar,lib/*.jar,config/,bin/* 文件 (如果不用assembly,也可以手动组装)

pom.xml打包插件的引入

<!--            打thin瘦包-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <configuration>
                    <layout>ZIP</layout>
                </configuration>
            </plugin>
<!--打瘦包是将依赖的jar全部放到lib目录-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 将依赖放到target/lib目录下 -->
                            <outputDirectory>target/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
<!--            assembly 将lib目录,demo.jar, config,bin文件等组合成一个发布包-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <!--   这个是assembly 所在位置;${basedir}是指项目的的根路径  -->
                    <descriptors>
                        <descriptor>${basedir}/assembly.xml
                        </descriptor>
                    </descriptors>
                    <!--打包解压后的目录名;${project.artifactId}是指:项目的artifactId-->
                    <finalName>${project.artifactId}</finalName>
                    <!-- zip包文件名不加上assembly.xml中配置的id属性值 -->
                    <appendAssemblyId>false</appendAssemblyId>
                    <!-- 打包压缩包位置-->
                    <outputDirectory>${project.build.directory}/release</outputDirectory>
                    <!-- 打包编码 -->
                    <encoding>UTF-8</encoding>
                </configuration>
                <executions>
                    <execution><!-- 配置执行器 -->
                        <id>make-assembly</id>
                        <phase>package</phase><!-- 绑定到package生命周期阶段上 -->
                        <goals>
                            <goal>single</goal><!-- 只运行一次 -->
                        </goals>
                    </execution>
                </executions>
            </plugin>

assembly文件

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 http://maven.apache.org/xsd/assembly-2.1.1.xsd">
    <id>assembly</id>
    <formats>
        <!--zip/tar/tar.gz或tgz/tar.bz2或tbz2/tar.snappy/tar.xz或txz/jar/dir/war-->
<!--        <format>tgz</format>-->
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <lineEnding>unix</lineEnding>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>./config</outputDirectory>
            <includes>
                <include>*.properties</include>
                <include>*.yml</include>
                <include>*.xml</include>
            </includes>
        </fileSet>
<!--        启动脚本-->
        <fileSet>
            <lineEnding>unix</lineEnding>
            <directory>${project.basedir}/build/bin</directory>
            <outputDirectory>./bin</outputDirectory>
            <!--打包文件权限-->
            <fileMode>0755</fileMode>
        </fileSet>
        <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
        <fileSet>
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>./lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>

        <!-- 执行的主jar文件 -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>./</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
<!--    <files>-->
<!--    处理单个文件-->
<!--        <file>-->
<!--        </file>-->
<!--    </files>-->

</assembly>

打包后文件目录

主jar包的内部结构

内部结构

主jar包的MANIFEST.MF文件

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: shenyun
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_321

1、内部结构是扁平的配置文件+编译class文件+META-INF文件

2、MANIFEST.MF不带有Main-class的指定,只有很简单的说明

启动命令

java -cp ".:\
/opt/flinkgui-web/lib/*:\
/opt/flinkgui-web/flinkgui-web-1.0-SNAPSHOT.jar" \
com.shenyun.flinkgui.Application

启动命令解释

java -cp ".:${path_1}:${path_2}" ${mainClassFullName}

1、-cp是java的标准参数,为jar的搜索路径

2、jar的搜索路径必须写全路径,不能使用相对路径

3、jar的搜索路径,jdk1.6以上,可以使用通配符 "/xxx/lib/*",但是不能写成"/xxx/lib/*.jar"

4、jar搜索路径有几个就要写完,linux使用冒号分割:,windows使用分号;分割

5、jar搜索路径需要使用引号包裹,

6、建议jar搜索路径前将点号 .加到最前面,这个将作为程序运行的classpath,日志文件目录默认在该路径下

7、spring boot的项目需要读取外部配置文件,可以在config文件夹中修改,文件夹名字config是spring的标准,非java的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 奇淫技巧,助你更好的摸鱼

作为一个数据分析者&#xff0c;日常工作几乎离不 python。一路走来&#xff0c;积累了不少有用的技巧和 tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按 A-Z 的顺序进行展示。 ALL OR ANY Python 之所以成为这么一门受欢迎的语言一个原因是它的可读…

(一)整合管理范围管理

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.指定项目章程2.项目管理计划3.指导4。管理项目知识4.5.监控项目工作4.6 实施整体变更控制4.7 项目收尾合同5。范围管理收集需求定义范围创建WBS确认范围&#xff1b;控制范围Survive by day and develop by night. …

Redis内存耗尽后会发生什么?

Redis内存耗尽后会发生什么?前言设置有效期过期策略8 种淘汰策略LRU 算法Redis 如何管理热度数据LFU 算法访问频次递增访问频次递减前言 作为一台服务器来说&#xff0c;内存并不是无限的&#xff0c;所以总会存在内存耗尽的情况&#xff0c;那么当 Redis 服务器的内存耗尽后…

什么是Spring的AOP功能?

如果说 IOC 是 Spring 的核心&#xff0c;那么面向切面编程AOP就是 Spring 另外一个最为重要的核心。 AOP的定义 AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff0…

学会这3个小技巧,轻松去图片水印

有些小伙伴在浏览个别平台时&#xff0c;会看到一些心水的图片&#xff0c;就想保存下来&#xff0c;拿来当头像壁纸&#xff0c;或是发朋友圈时用来配图。但是有些图片下载后会发现自带着平台水印&#xff0c;虽然理解它们是为了保护自身权益&#xff0c;但我们并不是进行商用…

【Java实战】大厂都是怎样进行单元测试的

目录 一、前言 二、单元测试 1.【强制】好的单元测试必须遵守 AIR 原则。 2.【强制】单元测试应该是全自动执行的&#xff0c;并且非交互式的。测试用例通常是被定期执行的&#xff0c;执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。不…

微服务的灰度发布就该这样设计

实际生产中如有需求变更&#xff0c;并不会直接更新线上服务&#xff0c;最通常的做法便是&#xff1a;切出线上的小部分流量进行体验测试&#xff0c;经过测试后无问题则全面的上线。 这样做的好处也是非常明显&#xff0c;一旦出现了BUG&#xff0c;能够保证大部分的客户端正…

Hygieia (Devops)开源-搭建步骤(一)

什么是Hygieia Hygieia出现在两个独立的仪表板中-一个用于工程师&#xff0c;另一个用于高管-直观地描绘了CICD管道。本质上&#xff0c;Hygieia本身是一个聚合器&#xff0c;可从团队在其CICD管道中使用的各种DevOps工具中提取数据&#xff0c;从而使其易于在仪表板视图中进行…

Docker搭建私有镜像仓库及推送、拉取私服镜像

1.搭建私有镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 1.1 简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像仓库&#xff0c;具备仓库管理的完整功能&#xff0c;但是没有图形化界面。 搭建方式比较简单&#xff0c;命令…

【配准:泛锐化】

SIPSA-Net: Shift-Invariant Pan Sharpening with Moving Object Alignment for Satellite Imagery &#xff08;SIPSA-Net&#xff1a;卫星影像平移不变平移锐化与运动目标对齐&#xff09; 全色锐化是合并高分辨率&#xff08;HR&#xff09;全色&#xff08;PAN&#xff0…

SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel

一、前言 今天小编带大家一起整合一下easyExcel&#xff0c;之所以用这个&#xff0c;是因为easyExcel性能比较好&#xff0c;不会报OOM&#xff01; 市面上常见的导入导出Excel分为三种&#xff1a; hutooleasyExcelpoi hutool和easyExcel都是对poi的封装&#xff0c;使用…

(12)点云数据处理学习——表面重建

1、主要参考 &#xff08;1&#xff09;官网的介绍 Surface reconstruction — Open3D 0.16.0 documentation &#xff08;2&#xff09;大佬的blog 三维点云重建 — open3d python_Coding的叶子的博客-CSDN博客_三维点云重建 &#xff08;3&#xff09;视频 Surface Rec…

一种隐私保护边云协同训练

研究背景 在边缘AI领域&#xff0c;联邦学习概念最先由google提出并在学界和业界得到广泛的讨论和发展。对于边缘AI&#xff0c;数据异构和数据隐私是两个主要的挑战&#xff0c;而将联邦学习应用在边缘计算中&#xff0c;可以协助解决这些挑战。FedAvg通过主动选择每一轮参与训…

Linux MySQL下载安装

介绍 查询当前系统中安装的所有软件 rpm -qa1. mysql的下载 1.1 查询当前系统中安装的名称带mysql的软件 rpm -qa | grep mysql如下所示没有输出说明是没有安装mysql 1.2 查询当前系统中安装的名称带mariadb的软件(如果有则卸载) rpm -qa | grep mariadb如下所示表示有ma…

Flink系列之Flink中StateBackend深入剖析和应用

title: Flink系列 一、Flink StateBackend 深入剖析和应用 ​ StateBackend 定义了状态是如何存储的&#xff0c;不同的 State Backend 会采用不同的方式来存储状态&#xff0c;核心入口是&#xff1a; StateBackend&#xff0c; Flink 提供了三种不同形式的存储后端&#xff…

Antd React UMI 配置优化 - 优化打包体积,提高打包速度

随着项目越来越大&#xff0c;打包后的体积很大&#xff0c;打包时间也很长&#xff0c;部署一次基本上要等十分钟左右。那么如何来优化打包体积和提高打包速度呢&#xff1f;一起来看看吧&#xff5e; 优化前打包体积分析 优化前个模块体积&#xff1a; 通过脚本命令&#x…

年产2万吨山楂酒工厂的设计—原料前处理工段及车间的设计(lunwen+cad图纸)

目 录 1前 言 1 1.1设计背景及目的 1 1.1.1山楂酒的介绍及功效 1 1.1.2目标人群 1 1.1.3发展前景 2 1.2设计依据 2 1.3设计内容 2 1.4原材料的选择 3 2工艺流程设计 5 2.1工艺流程的确定 5 2.2分选 6 2.3清洁消毒 8 2.4去核 9 2.4.1去核机的介绍及选择 9 2.4.2山楂核的处理 10 …

MQ 概念介绍 / 配置以及原理 简书

文章目录 1、什么是MQ 2、MQ的多种产品 3、MQ的工作原理 4、ActiveMQ 的配置 5、ActiveMQ 的数据存储方式 6、ActiveMQ的主从服务 7、ActiveMQ的集群负载均衡 什么是MQ&#xff1f; Message Queue, 就是消息队列&#xff0c;MQ 经常会作为多系统当中的网络消息传输。是…

负载均衡式在线OJ判题系统

文章目录负载均衡式在线OJ1. 演示项目2. 所用技术及开发环境所用技术&#xff1a;开发环境3. 项目宏观设计I. leetcode结构II.宏观结构III.编写思路4. compiler服务1. 编译功能&#xff1a;2. 运行功能3. 编译并运行功能4. 打包成一个网络服务5. 基于MVC结构的oj服务设计1. 用户…

Java IO流(详解)

1. File1. 创建2. 操作1. 获取文件信息2. 目录创建/删除2. IO流1. FileInputStream1. 简单使用2. 读取中文2. FileOutputStream1. 简单使用2. 追加写入3. 文件拷贝4. FileReader1. 简单使用2. 提高读取速度5. FileWriter1. 简单使用6. 节点流和处理流简介7. BufferedReader1. 简…