Spring Boot添加scope=system外部JAR后,Jar包运行报错问题
解决Spring Boot中system scope外部依赖导致jar运行失败的问题
我之前也踩过一模一样的坑!问题的核心其实很好理解:Maven的system scope依赖默认不会被打包到最终的可执行jar里。Eclipse里能正常运行,是因为IDE已经帮你把这个外部依赖加到了项目的类路径中;但用java -jar springBoot.jar启动时,JVM找不到这个缺失的依赖jar,才会抛出那些和DataSource、JdbcTemplate相关的依赖异常。
下面给你几个实用的解决方案,按推荐程度排序:
方案一:把外部jar安装到本地Maven仓库(最稳妥)
把外部依赖纳入Maven的管理体系,彻底摆脱system scope的限制:
- 打开终端,执行以下命令(替换成你的jar路径、自定义的groupId、artifactId和版本号):
mvn install:install-file -Dfile=/path/to/your/external.jar -DgroupId=com.your.custom.group -DartifactId=your-artifact-name -Dversion=1.0.0 -Dpackaging=jar
- 然后修改项目
pom.xml里的依赖配置,去掉system scope和systemPath,改成普通的compile scope:
<dependency> <groupId>com.your.custom.group</groupId> <artifactId>your-artifact-name</artifactId> <version>1.0.0</version> </dependency>
重新执行mvn package打包后,这个依赖会被正常包含到jar里,再用java -jar启动就没问题了。
方案二:配置Spring Boot Maven插件,强制包含system scope依赖
如果不想把jar安装到本地仓库,可以直接修改Spring Boot插件配置,让它把system依赖打包进可执行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>
重新打包后,system依赖会被放到jar的BOOT-INF/lib目录下,运行时JVM就能自动识别到。
方案三:将外部jar单独放在lib目录并配置类路径
适合需要把外部jar和可执行jar分开存放的场景:
- 先配置Maven依赖插件,把system依赖复制到打包后的lib目录:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-system-deps</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>system</includeScope> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 再修改Spring Boot插件,配置MANIFEST.MF的类路径指向lib目录:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </configuration> </plugin>
打包完成后,把生成的springBoot.jar和lib目录放在同一层级,再执行java -jar springBoot.jar就能正常启动了。
内容的提问来源于stack exchange,提问作者Ashutosh Pandey
相关产品推荐
相关产品推荐

