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

执行maven install后缺失Java类,IDE中运行应用正常

解决Maven打包Jar后运行出现NoClassDefFoundError的问题

这个问题我之前开发JavaCV相关项目时也碰到过,核心原因很明确:IDE运行时会自动帮你加载所有Maven依赖的第三方库,但Maven默认打包生成的Jar只包含你自己编写的代码,不包含依赖的类文件,所以直接运行Jar时就找不到org.bytedeco.javacv.OpenCVFrameGrabber这类第三方类了。

下面给你几个靠谱的解决方案,按推荐程度排序:

方案1:使用maven-shade-plugin打包(最常用)

maven-shade-plugin会把所有依赖的类合并到你的Jar包里,生成一个包含所有依赖的可执行Jar。在你的项目pom.xml里加入以下插件配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <!-- 指定主类,这样可以直接用java -jar运行 -->
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.wcapture.server.App</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置完成后,执行打包命令:

mvn clean package

打包完成后,在target目录下会生成两个Jar文件,其中带有-shaded后缀的就是包含所有依赖的可执行Jar,运行它:

java -jar your-project-name-shaded.jar

方案2:使用maven-assembly-plugin打包

这个插件也能生成包含依赖的Jar,配置方式如下:
在pom.xml中加入:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>org.wcapture.server.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行打包命令:

mvn clean assembly:single

运行生成的带-jar-with-dependencies后缀的Jar即可。

方案3:手动指定类路径运行(适合临时测试)

如果你不想重新打包,可以把所有依赖的Jar放在一个lib目录下(比如从Maven仓库复制),然后用以下命令运行:

# Linux/Mac系统
java -cp your-project.jar:lib/* org.wcapture.server.App

# Windows系统
java -cp your-project.jar;lib/* org.wcapture.server.App

总结一下,IDE能正常运行是因为它在启动时把Maven本地仓库里的所有依赖Jar都加入了类路径,而Maven默认打包的Jar不包含这些依赖,所以必须通过插件把依赖打包进去,或者手动指定类路径才能正常运行。

内容的提问来源于stack exchange,提问作者NakedCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:37