You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Maven中添加外部JAR引发NoClassDefFoundError问题求助

解决Maven打包时包含外部system scope JAR的问题

我之前踩过一模一样的坑!用system scope引入的依赖,Maven默认是不会把它打包到最终生成的JAR里的——毕竟这个scope本来是给系统级依赖设计的。给你两个亲测有效的解决方案:

方案一:使用maven-assembly-plugin

这个插件能帮你把所有依赖(包括system scope的)打包成一个可执行的胖JAR,配置步骤如下:

  1. 在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>
  1. 执行打包命令:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:25:12