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
相关产品推荐
相关产品推荐

