Springboot jar包外置教程

    入职的第一个小任务是:使springboot项目的外部依赖jar包与项目本身打成的jar包分离。每次默认的把springboot项目打成可运行jar包,jar包都会包含项目依赖的所有文件,造成jar包过大,并且用到新的外部jar包时,又得重新生成项目jar包,加大了工作量。本教程针对项目依赖jar包外置以及过程中可能会遇到的问题进行阐述。

一、jar包外置

  1. 修改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>
  1. 运行如下命令对项目进行打包
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加载本地jar springboot加载外部jar_java

如果你顺利执行完上述三步,可以忽略以下内容,以下是我作为一个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>

    下面是项目的结构:

springboot加载本地jar springboot加载外部jar_spring boot_02


    项目主函数所在的包为: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文件夹结构如下图:

springboot加载本地jar springboot加载外部jar_spring boot_03


配置文件有.yml后缀和.properties不确定的可以都拷。

总结

    - 到此,我分离出的项目jar包已经能够完美运行。作为一个刚步入企业的应届小菜鸟,可以说我是第一次接触springboot框架和公司那一套以前没使用过的开发平台,本来是很简单的事情,到我手里也要几经周折,决定写这篇文章,更多的是想作为自己的日志,方便自己查阅,如果有帮到你,那也是额外的惊喜。