过程: springboot成功引入了本地jar包,并且idea运行成功,调用接口也成功;但是使用maven进行打包后,运行失败,报ClassNotFound错误,所以看来没有那么简单,经过搜索解决方案与测试,终于成功;
我直接copy原文吧:
相信大家和我一样肯定会遇到项目中需要导入自己写的一些jar,并不是所有的jar包在maven上都能下到的,特别有些是公司内部写的,或者自己封装的一下jar包,这种jar包怎么导入到SpringBoot项目中
1.我的jar包在项目中的位置
2.maven中导入(如果单独在idea,eclipse等编辑器中使用,就这样就可以了)
<!--导入自定义jar包-->
<!--工具类-->
<dependency>
<groupId>com.yun.common</groupId>
<artifactId>common</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/common-0.0.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>sdk</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/alipay-sdk-java-0.0.1.jar</systemPath>
</dependency>
3.如果单纯只是上面那样写,通过maven生成的项目jar运行会报错,缺少我们自己本地的jar包
怎么解决这个问题,在网上有很多写法,我基本都试完了,最后东拼西凑的弄出一种用法终于成功了,在这里记录下,顺便也帮助下和我一样的同学
图中1是springboot的maven插件不用说了吧
图中2才是我要说的重点,这个地方是指定我们本地jar包的位置,让maven打包的时候一起打进去
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.7.RELEASE</version>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/src/main/resources/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
</plugins>
4.新问题来了,如果单纯使用上面这段maven插件还是不能解决问题,还需要告诉maven具体要把哪些资源打包进去,我就是在下面这个绕了很久
图中1,2是我项目中用到的一些配置文件和本文无关,但是如果你除了jar包还有其他资源在项目resources文件夹下也要通过这种方式加载进去
图中3,4是绕了我很久的问题根源,网上很多地方都讲到了要配置图5,配置了之后你会发现你项目就启动不了,因为springboot的配置没加载进来,这个坑大家一定要注意。
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.txt</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<targetPath>config/</targetPath>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
PS:plugins标记和resources标记在maven中都位于build标记之下,build标记和dependencies标记是同级关系
备注: 上文中sping-boot-maven插件版本不知道可以不用指定,自动适配当前springboot版本,我实际用的下面:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/src/main/resources/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
</plugins>
原文地址:https://blog.youkuaiyun.com/dongdingzhuo/article/details/78731704?spm=1001.2014.3001.5506
实际中使用,两种方法:
第一种:
本地jar包位置:
<!--导入自定义jar包-->
<!--工具类-->
<dependency>
<groupId>com.auth</groupId>
<artifactId>auth</artifactId>
<version>1.3.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/auth-1.3.jar</systemPath>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/src/main/resources/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
</build>
第二种:
本地jar文件位置:
<dependency>
<groupId>cisdi.info.imc</groupId>
<artifactId>imc-common</artifactId>
<version>1.3.5.3-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${pom.basedir}/lib/imc-common-1.3.5.3-SNAPSHOT.jar</systemPath>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.13.RELEASE</version>
<configuration>
<!-- 打包时是否包含scope为system的依赖 -->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有人说还得加上那个resources,但是我没有加,也成功了;