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

Docker运行Spring TCPIP服务器时出现NoClassDefFoundError问题求助

解决Docker运行Spring TCP服务器时的NoClassDefFoundError问题

本地执行java -jar target/jp_lstnr-0.0.1-SNAPSHOT.jar程序运行正常,但Docker运行时抛出如下错误:

Exception in thread "main" java.lang.NoClassDefFoundError:org/springframework/context/support/ClassPathXmlApplicationContext

问题根源

你的Maven配置采用了依赖分离的打包方式:

  • maven-jar-plugin生成的jar包中,manifest文件指定了类路径前缀为dependency-jars/
  • maven-dependency-plugin会将所有运行时依赖复制到target/dependency-jars/目录下

但你的Dockerfile仅复制了target目录下的jar包,完全没有包含dependency-jars目录,导致容器内的JVM无法找到Spring等依赖类,从而抛出NoClassDefFoundError。

解决方案

有两种可行的修复方式:

方式一:构建包含所有依赖的Fat Jar(推荐)

修改pom.xml,使用maven-shade-plugin替换原有的maven-jar-plugin和maven-dependency-plugin配置,将所有依赖打包到单个可执行jar中:

<build>
    <!-- 移除原有的maven-jar-plugin和maven-dependency-plugin配置 -->
    <plugins>
        <!-- 保留kotlin-maven-plugin、maven-compiler-plugin等其他插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>app.Main</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行mvn clean package后,target目录下生成的jar包会包含所有依赖,原Dockerfile无需修改即可正常运行。

方式二:在Dockerfile中复制依赖目录并指定ClassPath

若不想修改Maven配置,需将dependency-jars目录也复制到容器中,并在启动命令中指定完整类路径:
修改后的Dockerfile:

FROM openjdk:11
EXPOSE 3459
ARG JAR_FILE=target/jp_lstnr-0.0.1-SNAPSHOT.jar
ARG DEPENDENCY_DIR=target/dependency-jars/
ADD ${JAR_FILE} app.jar
ADD ${DEPENDENCY_DIR} /dependency-jars/
ENTRYPOINT ["java","-cp","/app.jar:/dependency-jars/*","app.Main"]

这样容器内会包含所有依赖包,启动时JVM能正确加载所需类。

内容的提问来源于stack exchange,提问作者Youssef Dahmane Jdid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:55:51