运行pom.xml时遇java.lang.NoClassDefFoundError及TestNG POM无效问题
解决Maven Surefire插件运行时java.lang.NoClassDefFoundError问题
从你提供的构建日志来看,这个NoClassDefFoundError的核心原因是依赖解析异常——TestNG旧版本的POM无效、jcommander依赖缺失,导致Surefire插件无法加载所需的NestedCheckedException类。你之前更新Surefire插件和Maven版本没解决问题,大概率是没处理掉损坏的本地缓存和无效的TestNG依赖。
试试下面这些步骤:
1. 彻底清理并重新下载依赖
首先强制清理本地Maven缓存和项目编译文件,让Maven重新拉取完整的依赖包:
mvn clean install -U
-U参数会强制Maven更新所有快照和发布版本的依赖,避免使用本地缓存的损坏文件。
如果执行后还是有问题,手动删除本地仓库里有问题的依赖目录:- 找到你的Maven本地仓库(默认路径是
~/.m2/repository,Windows下是C:\Users\<你的用户名>\.m2\repository) - 删除
org/testng和com/beust/jcommander这两个文件夹,然后重新执行上面的命令。
2. 替换为稳定有效的TestNG和Surefire版本
日志里显示TestNG 5.14.x的POM全部无效,这些旧版本已经被淘汰,依赖解析必然出问题。你需要在pom.xml里显式声明稳定的TestNG版本,同时搭配兼容的Surefire插件:
配置TestNG依赖
<dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.8.0</version> <!-- 选一个最新的稳定版 --> <scope>test</scope> </dependency> </dependencies>
配置Surefire插件
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.2</version> <!-- 和TestNG 7.x兼容的版本 --> </plugin> </plugins> </build>
3. 统一项目编码(可选但推荐)
日志里提示使用平台编码Cp1252,这可能导致跨环境构建问题,建议在pom.xml里统一设置UTF-8编码:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties>
4. 检查Maven镜像配置
如果你的settings.xml里配置了自定义镜像,确认该镜像能正常访问Maven中央仓库,不会返回损坏的POM或依赖包。可以临时切换回中央仓库测试:
<repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories>
你提供的构建日志参考:
[INFO] 正在扫描项目... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] 构建 eGem 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [WARNING] org.testng:testng:jar:5.14.3的POM无效,将无法使用传递依赖(若有),启用调试日志获取更多详情 [WARNING] org.testng:testng:jar:5.14.4的POM无效,将无法使用传递依赖(若有),启用调试日志获取更多详情 [WARNING] org.testng:testng:jar:5.14.5的POM无效,将无法使用传递依赖(若有),启用调试日志获取更多详情 [WARNING] com.beust:jcommander:jar:1.66的POM缺失,无依赖信息可用 [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ eGem --- [WARNING] 使用平台编码(实际为Cp1252)复制已过滤资源,即构建依赖于平台! [INFO] 正在复制13个资源 [INFO] [INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ eGem --- [INFO] 无需编译 - 所有类均为最新版本 [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ eGem --- [WARNING] 使用平台编码(实际为Cp1252)复制已过滤资源,即构建依赖于平台! [INFO] 正在复制12个资源 [INFO] [INFO] --- maven-compiler-plugin:3.5.1:testCompile (default-testCompile) @ eGem --- [INFO] 无需编译 - 所有类均为最新版本 [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ eGem --- [WARNING] 注入错误: org.apache.maven.plugin.surefire.SurefirePlugin java.lang.NoClassDefFoundError: org/apache/maven/surefire/util/NestedCheckedException at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
内容的提问来源于stack exchange,提问作者Starlord
相关产品推荐
相关产品推荐

