記錄一次,java 引入外部jar包后,IDE運行正常,打包成jar包后,啟動提示找不到引入jar包中的類
核心報錯點
Caused by: java.lang.NoClassDefFoundError: com/lop/open/api/sdk/request/DomainAbstractRequest
部分pom文件
<dependency>
<groupId>com.lop</groupId>
<artifactId>open-api-sdk-open</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/lop_opensdk_support_1028.jar</systemPath>
</dependency>
<dependency>
<groupId>com.lop</groupId>
<artifactId>open-api-sdk-trans</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/TransferCenterService_v6_20250611163859.jar</systemPath>
</dependency>
<dependency>
<groupId>com.lop</groupId>
<artifactId>open-api-sdk-common</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/IntegratedLogistics_v1_20241015154119.jar</systemPath>
</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.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.4.RELEASE</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
惜秦皇漢武,略輸文采;唐宗宋祖,稍遜風騷。
一代天驕,成吉思汗,只識彎弓射大雕。
俱往矣,數風流人物,還看今朝

浙公網安備 33010602011771號