在做项目的时候,有时需要引入第三方Jar包来完成指定的功能。但是会出现,引入jar包后,在编辑器上可以正常访问,但是打包成war后就会报class not found的异常。
本篇所有操作都基于idea
一、引入jar包
1、在resources文件夹中创建一个lib文件夹,并复制Jar包。
2、点击File->Project Structure->Libraries
然后选择所在的lib文件夹,点击OK。
二、配置pom
1、引入jar包
<dependency>
<groupId>com.pdd</groupId>
<artifactId>pdd-sdk-1</artifactId>
<version>1.11.68</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/pop-sdk-1.11.68-all-sources.jar</systemPath>
</dependency>
${pom.basedir}
为maven的路径,也可用${project.basedir}
,但是我用这个的时候地址还是会错误。
groupId、artifactId、version
这三个可以随便写,想写啥都可以。重要的是scope、systemPath这两个要确保不出错。
scope就是system,systemPath为jar包所在路径。
到此,在idea中就可以正常的使用Jar包了,但是打包成war就会报class not found的异常
这是因为打包后,没有把jar包一起打包。
2、配置打包War(重点!)
1️⃣SpringBoot想要打包成war包部署的话,需要把SpringBoot自带的tomcat给干掉。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
网上查资料时,发现有很多人说还需要加上以下代码,但是我加上后反而不好使,所以我没有加。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
2️⃣修改自启动类,重写初始化代码
用过springboot都知道每个项目都有一个Application的启动类
我们需要把类似于web.xml的配置方式在application中启动spring的上下文,在启动类中继承SpringBootServletInitializer
重写configure
方法即可,其代码如下:
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(AllianceApplication.class);
}
3、打包war后一起打包jar(超重点!!)
把pom默认的Jar打包插件改为War打包插件,如果没有引入外部Jar则不需要修改,使用原来的插件即可
<!--打包war插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/resources/lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
三、打包war
可用idea的自带Maven工具直接打包,也可以使用命令打包。我是直接用工具的。
可以先clean然后再package,直接双击即可。这样就会在target打包成war,直接部署就好了。
以上。