记录一次,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>
posted @ 2025-07-20 12:55  yjbjingcha  阅读(77)  评论(0)    收藏  举报