大多数Web项目都会引用一些本地jar包,然后最终以war包的形式部署上线。但实际运行时jar包里面的类根本找不到,出现各种ClassNotFoundException、NoClassDefFoundError等错误。
这里记录一下注意事项和正确的解决方法:
1、先简单说下怎么配置war包部署(如果你原来是jar包部署的话):
<project ...>
<packaging>war</packaging>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
</project>
如上,pom.xml文件中加入packaging标签,写war;然后加入tomcat的provided级别的依赖。然后在IDEA中Build Artifacts即可生成war包,默认在项目根目录的target文件夹中。
2、假设我们引入了一个本地jar包(json-simple-1.1.1.jar),我这边文件放在 resources/lib 目录下,你也可以自定义其他目录,然后继续配置pom文件,在 dependencies 标签下加子标签:
<!-- jar libs -->
<dependency>
<groupId>lib1</groupId>
<artifactId>lib1</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/json-simple-1.1.1.jar</systemPath>
</dependency>
groupId和artifactId都可以瞎写,无所谓的,但scope和systemPath必须正确。
3、最关键的一步,因为要让本地依赖的jar包生效必须让它们置于 webapps/xxx/WEB-INF/lib 目录下才可以,所以继续配置pom文件:
<project ...>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>${project.basedir}/src/main/resources/lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后再打包就可以了。