使用Gradle构建从Eclipse运行JUnit测试时出现的类路径问题

使用Gradle构建从Eclipse运行JUnit测试时出现的类路径问题,eclipse,junit,gradle,Eclipse,Junit,Gradle,我有一个Gradle项目,该项目在XML数据文件上声明一个仅测试的依赖项,然后从类路径加载该文件。当我从命令行直接在Gradle中运行测试时,一切正常,但是当我运行“gradlew eclipse”,在eclipse中刷新项目,然后尝试从eclipse中运行测试(Debug As->JUnit test),测试失败,因为它找不到XML文件和类路径(从“调试”视图中进程的“属性”上下文菜单项访问)未显示类路径中包含的XML文件 我看到的行为与之有一些共同之处,但Sean的问题恰恰相反:他的测试在A

我有一个Gradle项目,该项目在XML数据文件上声明一个仅测试的依赖项,然后从类路径加载该文件。当我从命令行直接在Gradle中运行测试时,一切正常,但是当我运行“gradlew eclipse”,在eclipse中刷新项目,然后尝试从eclipse中运行测试(Debug As->JUnit test),测试失败,因为它找不到XML文件和类路径(从“调试”视图中进程的“属性”上下文菜单项访问)未显示类路径中包含的XML文件

我看到的行为与之有一些共同之处,但Sean的问题恰恰相反:他的测试在Ant下正常运行(但他从未提到尝试直接从EclipseJUnit插件运行),而不是在Gradle下

以下是build.gradle的相关部分:

依赖关系{ testCompile组:“com.mycompany”,名称:“myconfig文件”,版本:“0.0.0+dirty”,文本:“xml”}

因为URLClasspathLoader可以直接从文件系统加载的唯一资源是JAR,所以我使用以下静态方法在类路径中搜索与我需要加载的文件名匹配的文件:

public static String getFullPathForResourceDirectlyOnClasspath(String nameFragment) {
    ClassLoader cl = ClassLoader.getSystemClassLoader();
    for (URL url: ((URLClassLoader)cl).getURLs()){
        String fullPath = url.getFile();
        if (fullPath.contains(nameFragment)) {
            return fullPath;
        }
    }
    return null;
}
我将该方法称为:

getFullPathForResourceDirectlyOnClasspath(“/MyConfigFile-”);

当我从Gradle(“gradlew build”)运行该代码时,它会找到该文件,并且我的测试成功。当我从Eclipse(Debug As->JUnit test)运行该代码时,它在类路径上找不到该文件(因为Eclipse JUnit插件没有将其放在那里),并且该调用返回null

我曾尝试将配置从testCompile更改为compile,以查看这是否会产生影响,但这并没有改变任何东西(也许可以说明,即使选择了compile配置,我的.classpath也没有XML文件的任何条目)


有人知道这样做的方法吗?我只是缺少了一些显而易见的东西吗?

您似乎滥用了类路径来向测试传递单个参数(XML文件的绝对文件路径)。相反,您应该以正确的方式将XML文件放在(测试)类路径上(它需要进入类路径上列出的目录或Jar文件)并正确加载(例如,使用
getClass().getClassLoader().getResource(“some/resource.xml”)
),或者将文件路径作为系统属性传递给测试。自然,后者在不同的环境下(比如Gradle build和IDE)更难工作.

这不是特定于测试的;这是我们在应用程序在生产环境中运行时将这些配置文件传递给应用程序的方式,以允许通过Gradle和Ivy等依赖项管理技术对这些文件进行独立版本控制和下载。特定于测试的是,JUnit的类路径在从E运行时不包含这些配置文件clipse(虽然当测试从Gradle运行时它会这样做,当使用IvyDE时它也会这样做)。我们可以将每个XML文件包装在一个JAR中,这是正确的;决定是由其他人做出的,而不是我的电话不要这样做,因为这会使检查XML变得更加困难。如何与Eclipse集成?哪个Eclipse和Gradle版本?Eclipse是3.7.2。Gradle是1.7。集成是通过我们build.Gradle中的
apply plugin:'Eclipse'
实现的,尽管我不确定如何确定使用的是哪个版本的集成。(有什么建议吗?)
eclipse
插件是Gradle发行版的一部分,因此是1.7。在执行
Gradle cleanplipse-eclipse
之后,尽管上面有
testCompile
依赖项声明,您是否可以再次检查XML文件是否未从
.classpath
引用?如果您有多项目构建,请确保应用
eclipse
插件到
所有项目
。确认:在
gradle cleanEclipse
之后,
类路径
引用我的项目的各种JAR依赖项,但不引用XML文件。无论依赖项是指定为
testCompile
还是
compile
。类路径都是如此>包括来自
compile
依赖项和
testCompile
依赖项的JAR。