使用Gradle与JUnit运行测试时遭遇ClassNotFoundException问题
Gradle测试任务报ClassNotFoundException问题
我是Gradle新手,尝试一个简单的构建场景,项目目录结构如下:
│ └───src ├───main │ └───java │ ExampleApp.java │ └───test └───java ExampleTest.java
使用的build.gradle.kts配置:
plugins { java id("jvm-test-suite") } repositories { mavenCentral() } tasks.named<Jar>("jar") { manifest { attributes["Main-Class"] = "ExampleApp" } } testing { suites { val test by getting(JvmTestSuite::class) { useJUnitJupiter() } } } dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.0") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.9.0") }
运行命令:
./gradlew clean test
测试任务失败,错误日志如下:
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'ExampleTest'. at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:54) at java.base@21.0.1/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base@21.0.1/java.lang.reflect.Method.invoke(Method.java:580) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at jdk.proxy1/jdk.proxy1.$Proxy2.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) Caused by: org.gradle.internal.UncheckedException: java.lang.ClassNotFoundException: ExampleTest at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:68) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:170) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.access$100(JUnitPlatformTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:104) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:94) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:60) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:52) ... 16 more Caused by: java.lang.ClassNotFoundException: ExampleTest at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:534) at java.base/java.lang.Class.forName(Class.java:513) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:168) ... 21 more
生成的类文件目录结构显示测试类已编译:
│ ├───build │ ├───classes │ │ └───java │ │ ├───main │ │ │ ExampleApp.class │ │ │ │ │ └───test │ │ ExampleTest.class
补充信息:
- 运行环境:Windows 11,JDK 21,Gradle 8.6
- 相同类和目录结构用Maven可正常运行,改用JUnit4也会报同样错误
- 克隆JUnit5官方示例项目测试,同样出现
java.lang.ClassNotFoundException - macOS环境下运行完全正常
解决方案
1. 临时禁用Gradle守护进程
运行测试时添加--no-daemon参数:
./gradlew clean test --no-daemon
2. 配置Gradle禁用IPv6优先
在项目根目录的gradle.properties文件中添加以下配置(如果没有该文件则新建):
systemProp.java.net.preferIPv6Addresses=false
3. 检查项目路径
确保项目所在路径没有中文、空格或特殊字符,移到纯英文无空格的路径下再尝试构建。
4. 版本兼容调整
如果以上方法无效,尝试降级JDK版本到17(Gradle 8.6对JDK17的兼容性更稳定),或者降级Gradle版本到8.5。
内容的提问来源于stack exchange,提问作者Lionishy
相关产品推荐
相关产品推荐

