相关疑难解决方法(0)

使用Reflections google库的单元测试仅在Maven执行时失败

我正在使用Google Reflections库来查询类路径中的某些资源.这些资源与我项目中的类位于同一位置.

我写了一些单元测试,这些测试在Eclipse中作为单元测试执行时成功,但是当我尝试用Maven执行它们时(maven install例如),它们没有按预期工作.经过一些调试,显然问题是当使用Maven执行时,Reflections库找不到资源所在的类路径url.

我得出结论,研究Reflection如何确定应检查的类路径URL.作为一个例子,下面的方法显示了Reflection如何在给定类加载器的情况下找到可用的类路径URL(原始的Reflection方法已经简化了一点):

public static Set<URL> forClassLoader(ClassLoader... classLoaders) {
    final Set<URL> result = Sets.newHashSet();
    for (ClassLoader classLoader : classLoaders) {
        while (classLoader != null) {
            if (classLoader instanceof URLClassLoader) {
                URL[] urls = ((URLClassLoader) classLoader).getURLs();
                if (urls != null) {
                    result.addAll(Sets.<URL>newHashSet(urls));
                }
            } 
            classLoader = classLoader.getParent();
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

简而言之,它遍历类加载器层次结构,询问每个单独的类加载器的URL.

在Eclipse中,我使用类似这样的单元测试调用前一个方法:

    ClassLoader myClassClassLoader = <MyClass>.class.getClassLoader(); //<MyClass> is in the same classpath url than the resources I need to find
    Set<URL> urls = forClassLoader(myClassClassLoader); …
Run Code Online (Sandbox Code Playgroud)

java eclipse classloader maven-3 reflections

7
推荐指数
2
解决办法
2118
查看次数

标签 统计

classloader ×1

eclipse ×1

java ×1

maven-3 ×1

reflections ×1