Springboot jar包外置教程
入职的第一个小任务是:使springboot项目的外部依赖jar包与项目本身打成的jar包分离。每次默认的把springboot项目打成可运行jar包,jar包都会包含项目依赖的所有文件,造成jar包过大,并且用到新的外部jar包时,又得重新生成项目jar包,加大了工作量。本教程针对项目依赖jar包外置以及过程中可能会遇到的问题进行阐述。
一、jar包外置
- 修改pom.xml文件
pom.xml是管理项目源代码、配置文件、项目的url和项目的依赖关系等的一个重要文件。分离jar包需要在pom.xml添加如下插件代码:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--注意mainClass需要修改为自己项目main函数所在包的路径-->
<mainClass>com.xxx.App</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<!设置为nothing表示项目打成的jar包不包含外部依赖jar包-->
<groupId>nothing</groupId>
<artifactId>nothing<artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
- 运行如下命令对项目进行打包
mvn clean/*首先清除项目原有的target文件夹*/
mvn dependency:copy-dependencies -DoutputDirectory=target/lib package
/*把项目所依赖的所有外部jar包复制到target/lib文件夹下
3.运行项目jar包
第2步成功之后,我们可以点开项目生成的jar包,看到BOOT-INF文件夹下已经不再包含lib文件夹,相应的项目jar包变小了很多,lib文件夹和外部jar包已经移到了target文件夹下。接下来
Windows用户win+R输入cmd打开终端,Linux用户切换到终端路径切换到项目的target文件夹下。输入如下命令:
java -Dloader.path=./lib -jar springboot-0.01-SNAPSHOT.jar
//上式应修改自己项目jar包的名字
此时target目录应包含如下文件:
(至少应该包含lib和项目jar包,其余文件因项目而异)
如果你顺利执行完上述三步,可以忽略以下内容,以下是我作为一个springboot小白被虐的过程,如果你没顺利执行,请往下看,也许有你的问题。
二、常见问题
1.ClassNotFoundException
报错信息:
Exception in thread "main" java.lang.ClassNotFoundException: src.java.com.how2java.springboot.SpringbootApplication
原因及解决办法:
pom.xml中
<mainClass>src.java.com.how2java.springboot.SpringbootApplication</mainClass>
下面是项目的结构:
项目主函数所在的包为:com.how2java.springboot。所以<mainClass>
应改为:
<mainClass>com.how2java.springboot.SpringbootApplication</mainClass>
2.配置文件位置错误
这个错误是把我虐的最惨的,首先看一下报错信息:
Error starting ApplicationContext.To display the conditions report
re-run your application with 'debug' enable.
Error 16460 ---[ main] o.s.b.SpringApplication:Application run
failed.
org.springframework.beans.factory.BeanDefinitionStoreException:
Failed to process import candidates for cofiguration class [com.xxx.
App];nested exception is java.lang.NumberFormatException:null
at org.springframework.context.annotation.ConfigurationClassParse
r.processImports(ConfigurationClass Parser.java:597)~[spring-context
-5.2.2.RELEASE.jar:5.2.2.RELEASE]
......
后面省略号省略了一堆相似的jar包信息,乍一看会以为是jar包的问题,在确定了jar包和springboot版本对应没有问题之后,依然没有解决问题。
解决办法:
将项目文件夹resources
下的配置文件复制到项目jar包的同级目录,本项目拷贝配置文件后target
文件夹结构如下图:
配置文件有.yml
后缀和.properties
不确定的可以都拷。
总结
- 到此,我分离出的项目jar包已经能够完美运行。作为一个刚步入企业的应届小菜鸟,可以说我是第一次接触springboot框架和公司那一套以前没使用过的开发平台,本来是很简单的事情,到我手里也要几经周折,决定写这篇文章,更多的是想作为自己的日志,方便自己查阅,如果有帮到你,那也是额外的惊喜。