前言

简单的打包,无需多言吧,idea里面直接点点点就行。可惜凡事大都不能按照我们预期的那样。总有一些奇奇怪怪的需求,会让你头痛一会,但是遇到问题也不用慌,实际我们遇到的大多问题,网上一搜一大票解决方法,然后自己根据自己的经验从里面找到自己想要的结果就行。

springboot打包默认的情况下打完包后会进行一次测试,所谓测试就是启停一下项目,自己测试打包玩的时候,感觉并无大碍,最多只是拖慢一点打包速度。但实际上打包的线上配置很难和打包环境做到一致,就是说你用线上的配置打包项目,项目大多数情况下都是跑不起来的,那么这个默认的测试步骤就没啥用,一般我们都是关闭的。

关闭打包的测试配置

1
2
3
4
5
<properties>
<!-- 跳过测试 -->
<skipTests>true</skipTests>
...
</properties>

继续聊,Java项目的依赖管理工具,如Maven,又或者Gradle,给我们带来了方便的同时也有了一点点的小限制,实际上并不能称作为限制,只是需求太诡异吧,比如本程序员就遇到过,项目新旧碰撞,有一个依赖及其古老,多老不清楚,Maven中央仓库里已经找不到这个版本了,又不敢用别的依赖替换,那怎么办,项目怎么跑起来呢,大部分IDE工具玩的熟的人,知道怎么弄,手动添加classpath路径,不同IDE有不同的操作方法,不细说。知道这步的,项目开发调试运行没有问题了,但是,我既然都说了,问题肯定还没解决。开发的差不多了,打包发布,一上线,咋报错了呢,一般缺少依赖时,如果你启动过程中没有用到这个依赖,它不会报错,当你执行方法过程中某个类中用到了这个依赖,它才会报错。为啥报错呢,首先我们看异常,我也记不太清,依赖缺失的异常叫什么ClassNotFund什么之类的异常,单词记得不清楚,中式英语2级水平的我翻译就是找不到类异常。这时,对于SpringBoot打的包熟悉的人已经开始查看包里是否有问题,简单看一下,定位到问题了,我们手动添加的依赖,并不能被SpringBoot打包打进去,那怎么办呢。到也不难,既然maven中的依赖能打包进去,我们把依赖在Maven中配一下就行了呗。

Maven在pom中加载本地依赖方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>com.oracle</groupId> <!-- 这个随便填,一般用倒写域名的方式吧-->
<artifactId>ojdbc10</artifactId><!-- 这个同样随便填,上面加这个内容要保证全球唯一,所以一般都用域名来写-->
<version>1.0.0</version><!-- 随便写 -->
<scope>system</scope><!-- 不懂,请搜索Maven依赖scope标签做什么的-->

<!-- 核心:${project.basedir}指项目根路径, /lib/ojdbc10.jar,一般我是在项目根庐江下新建一个lib文件夹,里面放jar包即可。-->
<systemPath>${project.basedir}/lib/ojdbc10.jar</systemPath>
</dependency>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 将SystemScope配置的依赖打包到构建包中 -->
<includeSystemScope>true</includeSystemScope>
...
</configuration>
...
</plugin>

继续说吧,这两种以及涵盖了百分之八十以上情况,继续说打包,springboot的打包,很方便,一个整体的Jar包,一行命令就能直接运行启动,很不错。 在一些场景下,就是在你不方便访问线上测试的环境下,一个五六十兆的jar上传将及其麻烦,尤其是在线上测试的时候,实际上每次就更新几个文件,线上部署却依然需要上传很大的依赖,这种情况下,依赖和Jar包分开打包就显得十分有必要了。

SpringBoot项目Jar包依赖分离打包

这个需要几个步骤,首先我们按正常的方式默认打包一下,把正常的打包的Jar包中的lib文件夹粘贴出来,然后配置pom文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
...
<!--这里对应项目的主入口-->
<mainClass>com.jy.frame.BootApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
...
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<!--end-->
</plugin>

配置完成后重新打包得到的就是没有依赖的Jar包了,把Jar和上面拷出来的lib文件夹放在同一目录,运行的命令需要加上lib目录

1
java -jar -Dloader.path=./lib 打出来的Jar包名.jar