记录一次,java 引入外部jar包后,IDE运行正常,打包成jar包后,启动提示找不到引入jar包中的类 - 教程
核心报错点
Caused by: java.lang.NoClassDefFoundError: com/lop/open/api/sdk/request/DomainAbstractRequest
部分pom文件
dependency>
groupId>com.lopgroupId>
artifactId>open-api-sdk-openartifactId>
version>1.0version>
scope>systemscope>
systemPath>${project.basedir}/src/main/resources/lib/lop_opensdk_support_1028.jarsystemPath>
dependency>
dependency>
groupId>com.lopgroupId>
artifactId>open-api-sdk-transartifactId>
version>1.0version>
scope>systemscope>
systemPath>${project.basedir}/src/main/resources/lib/TransferCenterService_v6_20250611163859.jarsystemPath>
dependency>
dependency>
groupId>com.lopgroupId>
artifactId>open-api-sdk-commonartifactId>
version>1.0version>
scope>systemscope>
systemPath>${project.basedir}/src/main/resources/lib/IntegratedLogistics_v1_20241015154119.jarsystemPath>
dependency>
原因
system 范围的依赖问题:
使用了 <scope>system</scope>,并通过 systemPath 指定了一个本地路径的 JAR 文件。
system 范围的依赖不会被打包到最终的 JAR 文件中。这意味着在本地运行时,IDEA 能找到该依赖,但在打包后运行时,Spring Boot 无法加载该依赖。
本地路径依赖的局限性:
systemPath 是一个绝对路径或相对路径,依赖于项目的目录结构。
在打包后运行时,systemPath 指定的 JAR 文件可能无法被正确加载,因为它不会被包含在最终的 JAR 文件中。
Spring Boot 打包机制:
Spring Boot 的打包机制(例如 spring-boot-maven-plugin)会将所有 compile 和 runtime 范围的依赖打包到最终的可执行 JAR 中。
但 system 范围的依赖不会被包含在内
解决
在build时 将system指定进去
<includeSystemScope>true</includeSystemScope>
附pom文件
build>
finalName>${project.artifactId}finalName>
plugins>
plugin>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-maven-pluginartifactId>
version>2.3.4.RELEASEversion>
configuration>
includeSystemScope>trueincludeSystemScope>
configuration>
executions>
execution>
goals>
goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
浙公网安备 33010602011771号