Maven打包无法加载本地jar包,打包成功运行 jar 包提示 java.lang.NoClassDefFoundError
项目引用了本地jar包,如加密、私有协议等,未发布到 Maven 服务器,以 jar 包形式在项目中引用,正常开发时未出现问题,Maven 打包执行 mvn package 时提示 “程序包xx.xx不存在”。
原因是 scope 为 system 的 maven 打包默认是不打进 jar 包进去的。
需要修改 pom.xml 配置,把 jar 包以依赖形式加入 pom:
<dependency>
<groupId>net.lx</groupId>
<artifactId>testmv2</artifactId>
<version>1.0</version>
<scope>system</scope>
<!--testmv2-1.0.jar 放在项目根目录下的 libs 文件夹-->
<systemPath>${project.basedir}/libs/testmv2-1.0.jar</systemPath>
</dependency>
同时在 plugin 中添加 includeSystemScope 标记:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
执行 mvn package 打包成功后,运行 java -jar testmv-1.0-SNAPSHOT.jar
提示 java.lang.NoClassDefFoundError: net/lx/test/EncTest。
需要在 pom.xml 中添加 maven-assembly-plugin 插件, 此插件可以将项目中的代码、资源和所有依赖包的内容打成一个程序集,可以指定打包结果是否包含外部资源和外部资源以什么形式存在。
assembly 插件配置,
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 指定程序入口类 -->
<mainClass>com.zf.test1.Test1</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
assembly.xml 放在项目根目录
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<!-- 默认的配置 -->
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
<!-- 增加scope类型为system的配置 -->
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>system</scope>
</dependencySet>
</dependencySets>
</assembly>
再次执行 mvn package 打包成功,执行 java -jar xx.jar 正常运行。