Maven使用system scope引入本地依赖后Jar变小但启动失败
问题分析与解决方案
问题现象
- 使用
systemscope引入本地vzbiicommon-3.0依赖时,生成的Jar仅约81MB,但启动时抛出ClassNotFoundException,找不到com.hcs.cisco.www.HCSProvision_xsd.PartyRole类; - 使用仓库引入
vzbiicommon-2.4-FIX.3依赖时,生成的Jar约138MB,可正常启动。
原因解析
Jar大小差异:
systemscope是Maven的特殊依赖范围,默认情况下Spring Boot打包插件不会将systemscope的依赖及其传递依赖打包到最终可执行Jar中,因此生成的Jar体积更小;而仓库引入的依赖默认是compilescope,会将依赖本身以及其所有传递依赖(排除指定项除外)打包进Jar,所以体积更大。启动失败原因:
运行时JVM无法找到systemscope依赖中的类(包括其依赖的第三方类,比如PartyRole),因为这些类没有被包含在可执行Jar中,导致Spring容器初始化时反射自省类失败,最终启动报错。
解决方案
方案一:配置打包插件包含system scope依赖
修改pom.xml中的Spring Boot Maven插件配置,添加includeSystemScope参数,让插件将system scope的依赖打包进可执行Jar:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 包含system scope的依赖 --> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build>
重新执行clean install打包,生成的Jar会包含本地依赖,即可正常启动。
方案二:将本地Jar安装到本地Maven仓库(推荐)
这种方式更符合Maven依赖管理规范,避免system scope带来的路径依赖问题:
- 执行Maven命令将本地Jar安装到本地仓库:
mvn install:install-file -Dfile=/path/to/your/vzbiicommon-3.0.jar -DgroupId=vzbiicommon -DartifactId=vzbiicommon -Dversion=3.0 -Dpackaging=jar
- 修改依赖配置,去掉
system和systemPath,使用普通依赖引入:
<dependency> <groupId>vzbiicommon</groupId> <artifactId>vzbiicommon</artifactId> <version>3.0</version> <exclusions> <exclusion> <groupId>xbean</groupId> <artifactId>xbean</artifactId> </exclusion> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </exclusion> </exclusions> </dependency>
重新打包后,Maven会自动处理该依赖的传递依赖,生成的Jar可正常启动,同时依赖管理更规范。
内容的提问来源于stack exchange,提问作者Geo Thomas
相关产品推荐
相关产品推荐

