SpringBoot分离打包:将jar包与lib依赖、配置文件分开

一、前言

昨天和项目组内一位经验丰富的老师傅探讨,围绕着SpringBoot打包后动不动就一百多兆,在现场远程维护部署时非常不方便的问题,进行了一番请教。问题的根本是:有时候仅仅改动了一点点东西,却要发给现场替换包含所有依赖的jar包,这非常的笨重不方便。

于是又学到了新知识。抽空浏览了网上的资料,结合工作中的实际使用场景,整理了本文的内容,方便后期随时取用。

二、正文

之前一直使用SpringBoot初始化建立项目默认的spring-boot-maven-plugin插件,进行项目打包,这个插件会将项目所有的依赖打入BOOT-INF/lib下,这就导致了jar包的体积非常臃肿,尤其涉及到几十个子项目时,整个项目的体积可想而知。但是,各项目之间有非常的公共依赖,因此,分离打包还是比较有意义的。

本文还是在上两篇的项目上进行测试,毕竟只改了pom文件中的build标签下的插件内容
如果有兴趣可翻阅:SpringBoot整合新版Mybatis-Plus代码生成器SpringBoot整合Knife4j替代Swagger

1.整个项目的目录结构

在这里插入图片描述

2.系统环境变量配置

在这里插入图片描述

3.pom文件配置——本文重点,其它部分甚至不用看

pom中几乎所有的配置项都有比较详细的注释,表明每个属性是做什么,以及如何配置,请根据项目实际进行配置。

  • properties标签中定义依赖的输出目录、jar包的输出目录、resources中配置文件的输出目录。
   <properties>
        <!--依赖输出目录-->
        <output.dependence.file.path>lib/</output.dependence.file.path>
        <!--jar输出目录-->
        <output.jar.file.path>bin/</output.jar.file.path>
        <!--配置文件输出目录-->
        <output.resource.file.path>config/</output.resource.file.path>
    </properties>
  • build标签:plugins标签中一共包含三个插件:maven-jar-plugin、maven-dependency-plugin和maven-resources-plugin。

啰嗦一句,在下方配置中会看到有…/这种相对路径的配置,其实非常简单,只要把握住一点,一切从最终的jar包出发,考虑如何让它能够找到它所依赖的lib和配置文件即可。

<build>
        <plugins>
            <!-- 打JAR包,不包含依赖文件;显式剔除配置文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!--${env.LEARN_HOME}为项目配置的环境变量,下同-->
                    <outputDirectory>${env.LEARN_HOME}/${output.jar.file.path}</outputDirectory>
                    <!-- 将配置文件排除在jar包 -->
                    <excludes>
                        <exclude>*.properties</exclude>
                        <exclude>*.yml</exclude>
                        <exclude>*.xml</exclude>
                        <exclude>*.txt</exclude>
                    </excludes>
                    <archive>
                        <!-- 生成的jar中,包含pom.xml和pom.properties这两个文件 -->
                        <addMavenDescriptor>true</addMavenDescriptor>
                        <!-- 生成MANIFEST.MF的设置 -->
                        <manifest>
                            <!--这个属性特别关键,如果没有这个属性,有时候我们引用的包maven库 下面可能会有多个包,并且只有一个是正确的,
                            其余的可能是带时间戳的,此时会在classpath下面把那个带时间戳的给添加上去,然后我们 在依赖打包的时候,
                            打的是正确的,所以两头会对不上,报错。 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
                            <addClasspath>true</addClasspath>
                            <!-- MANIFEST.MF 中 Class-Path 各个依赖加入前缀 -->
                            <!--这个jar所依赖的jar包添加classPath的时候的前缀,需要 下面maven-dependency-plugin插件补充-->
                            <!--一定要找对目录,否则jar找不到依赖lib,前边加../是因为jar在bin下,而bin与lib是平级目录-->
                            <classpathPrefix>../${output.dependence.file.path}</classpathPrefix>
                            <!--指定jar启动入口类 -->
                            <mainClass>com.ieslab.knife4j.demo.DemoApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <!-- 假如这个项目可能要引入一些外部资源,但是你打包的时候并不想把 这些资源文件打进包里面,这个时候你必须在
                            这边额外指定一些这些资源文件的路径,假如你的pom文件里面配置了 <scope>system</scope>,就是你依赖是你本地的
                            资源,这个时候使用这个插件,classPath里面是不会添加,所以你得手动把这个依赖添加进这个地方 -->
                            <!--MANIFEST.MF 中 Class-Path 加入自定义路径,多个路径用空格隔开 -->
                            <!--此处resources文件夹的内容,需要maven-resources-plugin插件补充上-->
                            <Class-Path>../${output.resource.file.path}</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

            <!-- 复制依赖的jar包到指定的文件夹里 -->
            <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>${env.LEARN_HOME}/${output.dependence.file.path}</outputDirectory>
                            <!-- 是否排除间接依赖,间接依赖也要拷贝 -->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 是否带上版本号 -->
                            <stripVersion>false</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 用于复制指定的文件 -->
            <plugin>
            	<groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <!-- 复制配置文件 -->
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <includes>
                                    	<!--将如下格式配置文件拷贝-->
                                        <exclude>*.properties</exclude>
                                        <exclude>*.yml</exclude>
                                        <exclude>*.xml</exclude>
                                        <exclude>*.txt</exclude>
                                    </includes>
                                </resource>
                            </resources>
                            <!--输出路径-->
                            <outputDirectory>${env.LEARN_HOME}/${output.resource.file.path}</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

4. 打包

首先,把右上角的闪电图标点上,可以在打包时“跳过测试模式”。然后分别双击执行clean和package命令,进行清理和打包。
在这里插入图片描述
打包成功:
在这里插入图片描述
打包完成后,我们去输出目录看一下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.测试,测试依赖于前两篇所构建的测试项目,当然这不重要

进入bin目录下:在地址栏输入cmd回车
在这里插入图片描述
启动项目:java -jar demo-1.0.0.jar
在这里插入图片描述
启动成功:
在这里插入图片描述
浏览器输入knife4j地址验证一下:
在这里插入图片描述

三、总结

本文关于SpringBoot分离打包的内容就这么多,有兴趣可以试一下。

当然还有很多不足需要继续探索的地方,比如,将所有的配置文件都输出到config目录下,项目很多怎么办?是不是应该考虑config目录下,每一个子项目一个独立目录?还有整个项目的公共配置如何处理?不可能每个项目都维护一份公共配置信息,万一修改需要修改很多处,那需要怎么解决?

下次见。

  • 49
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
将vue与springboot分离开发的项目打包上线可以分为以下几个步骤: 1. 打包vue项目:在vue项目根目录下,使用命令行运行`npm run build`,该命令会在项目根目录下生成一个dist目录,里面包含了打包后的静态文件。 2. 拷贝vue打包文件:将打包生成的dist目录中的所有文件拷贝到springboot项目的静态资源目录下,一般是springboot项目的resources/static目录。 3. 在springboot中启动vue静态资源:在springboot项目的Controller中新增一个RequestMapping,使其映射到vue的首页。例如,可以在HomeController中添加如下代码: ``` @Controller public class HomeController { @RequestMapping(value = {"/", "/index"}) public String index() { return "index.html"; } } ``` 这样访问项目的根路径或/index路径时,就会自动访问vue的首页。 4. 打包springboot项目:使用springboot内置的打包功能将整个项目打包成一个可执行的jar文件。可以使用如下命令进行打包: ``` mvn clean package ``` 打包完成后,在项目的target目录下会生成一个以.jar结尾的可执行文件。 5. 部署上线:将打包生成的jar文件上传到部署服务器上,并安装Java运行环境。然后使用命令行运行以下命令启动springboot项目: ``` java -jar yourjarfilename.jar ``` 项目就会在服务器上运行起来,可以通过访问服务器IP地址+配置的端口号来访问项目了。 通过以上步骤,就可以将vue与springboot分离开发的项目打包上线。将vue的静态资源打包springboot项目中,并在springboot中启动静态资源。然后使用springboot内置的打包功能将整个项目打包成一个可执行的jar文件,最终将jar文件部署到服务器上运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小宗啊?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值