在Maven中添加外部JAR引发NoClassDefFoundError问题求助
解决Maven打包时包含外部system scope JAR的问题
我之前踩过一模一样的坑!用system scope引入的依赖,Maven默认是不会把它打包到最终生成的JAR里的——毕竟这个scope本来是给系统级依赖设计的。给你两个亲测有效的解决方案:
方案一:使用maven-assembly-plugin
这个插件能帮你把所有依赖(包括system scope的)打包成一个可执行的胖JAR,配置步骤如下:
- 在
pom.xml里添加插件配置:
<build> <plugins> <!-- 保留你原来的system依赖 --> <dependency> <groupId>be.april.meter</groupId> <artifactId>JRPiCam</artifactId> <version>1.1.1</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/jrpicam-1.1.1.jar</systemPath> </dependency> <!-- 添加assembly插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <!-- 指定打包为包含所有依赖的JAR --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 若需要可执行JAR,替换成你的主类路径 --> <archive> <manifest> <mainClass>com.yourpackage.YourMainClass</mainClass> </manifest> </archive> <!-- 强制包含system scope的依赖 --> <includeSystemScope>true</includeSystemScope> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 执行打包命令:
mvn clean package
打包完成后,target目录下会出现一个带-jar-with-dependencies后缀的JAR文件,这个就是包含了JRPiCam的胖JAR。
方案二:使用maven-shade-plugin
这个插件同样能打包胖JAR,还支持依赖重命名(避免类冲突),配置如下:
<build> <plugins> <!-- 保留原system依赖 --> <dependency> <groupId>be.april.meter</groupId> <artifactId>JRPiCam</artifactId> <version>1.1.1</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/jrpicam-1.1.1.jar</systemPath> </dependency> <!-- 添加shade插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 强制包含system依赖 --> <includeSystemScope>true</includeSystemScope> <!-- 指定主类(若需要可执行JAR) --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,target目录下的主JAR文件就已经包含了所有依赖(包括JRPiCam)。
额外建议
如果条件允许,尽量别用system scope依赖——它会让项目在其他环境下构建失败(别人的机器上可能没有这个JAR)。你可以把这个JAR安装到本地Maven仓库,命令如下:
mvn install:install-file -Dfile=src/main/resources/jrpicam-1.1.1.jar -DgroupId=be.april.meter -DartifactId=JRPiCam -Dversion=1.1.1 -Dpackaging=jar
然后把pom里的依赖改成普通的compile scope:
<dependency> <groupId>be.april.meter</groupId> <artifactId>JRPiCam</artifactId> <version>1.1.1</version> </dependency>
这样后续打包不用额外配置插件,Maven会自动处理这个依赖。
内容的提问来源于stack exchange,提问作者Jérémy
相关产品推荐
相关产品推荐

