springboot打包二三事

爱情是两个强者之间的风花雪月,而不是弱者之间的苦大仇深。

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

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

关闭打包的测试配置

<properties>
    <!-- 跳过测试 -->
    <skipTests>true</skipTests>
    ...
</properties>

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

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

<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文件

<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目录

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

短发女孩


springboot打包二三事
https://wangijun.com/2021/10/20/java-03/
作者
无良芳
发布于
2021年10月20日
许可协议