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

Gradle未复制包本地测试资源:如何实现Eclipse相同测试行为?

问题:Gradle测试无法加载src/test/java下的资源文件,与Eclipse行为不一致

最小化Gradle配置

plugins {
    id 'eclipse'
    id 'java'
}
repositories {
    mavenCentral()
}
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
}
tasks.named('test') {
    useJUnitPlatform()
}

源码目录结构

└───src
    └───test
        └───java
            └───abc
                    package-local.txt
                    ResourceTest.java

测试代码

package abc;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;

public class ResourceTest {

    @Test
    void loadResource() {
        assertNotNull(getClass().getResource("package-local.txt"));
    }
    
}

上述测试在Eclipse中运行正常,但执行gradlew test时失败,原因是Gradle未将src/test/java/abc/package-local.txt复制到测试执行的类路径中。请问这是为什么?该如何配置才能实现与Eclipse相同的行为?


原因分析

Gradle的Java插件遵循Maven标准约定:

  • src/test/java仅作为Java源码目录,只有.java文件会被编译,其他类型文件不会被复制到测试类路径
  • 测试资源文件的标准存放路径是src/test/resources,该目录下的文件会自动被复制到测试类路径

而Eclipse的Java项目默认会把src/test/java同时视为源码目录和资源目录,所有非.java文件都会被当作资源加入类路径,这就是两者行为差异的核心原因。

解决方法

有两种方案可以实现与Eclipse一致的行为:

方案1:遵循Gradle标准约定(推荐)

将package-local.txt移动到src/test/resources/abc/目录下,保持和测试类相同的包结构。Gradle会自动将该目录下的资源复制到测试类路径,无需修改配置。

方案2:修改Gradle配置,适配Eclipse的资源处理逻辑

如果不想调整文件位置,可以通过配置sourceSets让Gradle把src/test/java下的非.java文件也当作资源处理:

sourceSets {
    test {
        resources {
            srcDirs += 'src/test/java'
            exclude '**/*.java' // 排除Java源码文件,避免重复处理
        }
    }
}

添加这段配置后,Gradle会在构建时将src/test/java下的所有非.java文件复制到测试类路径,和Eclipse的行为保持一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:32:14