getResourceAsStream在一种情况下返回null,而不是另一种情况,具有相同的类路径

时间:2015-03-26 17:34:13

标签: java eclipse maven junit contextclassloader

我有两个相同应用的衍生物,比如版本(A)和(B)。它们每个都包含项目: (1)test-data-war,其中包含target/test-classes/log4j.properties,以及(2)test-kernel,其中包含target/test-classes/log4j.propertiestarget/test-classes/test.properties

当我在(1)中运行特定的jUnit测试时,它调用(2)中调用的方法 Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);在(A)中,resourceName为“log4j.properties”,结果不为null,路径为(1),但resourceName为“test.properties”一片空白。在(B)中,resourceName为“log4j.properties”,它不是null,路径在(1)中,resourceName为“test.properties”,它不是null,路径在( 2)。

为什么{A}中Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");为空?起初,我认为类路径可能不同,但它们对于(1)和(2)都是相同的。

修改 以下是(1)的.classpath文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/classes"    path="src/main/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
     <classpathentry kind="src" output="target/test-classes"  path="src/test/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
     </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes> 
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
        <attributes>
             <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" pat h="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
            <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

以下是(2)的.classpath文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
     <classpathentry kind="src" output="target/test-classes" path="src/test/java">
         <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
          </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
         </attributes> 
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
     </classpathentry>
     <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
           <attribute name="maven.pomderived" value="true"/>
            <attribute name="org.eclipse.jst.component.nondependency" value=""/>
        </attributes> 
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

2 个答案:

答案 0 :(得分:1)

模块test-kernel中的测试类路径中的资源对于模块test-data-war不可见。当您将它们作为依赖项添加到另一个模块时,模块仅导出src/main/resources下的资源。

令人困惑的是Eclipse和Maven在这里不同意。在Eclipse中,模块的整个类路径是可见的(也是测试资源)。但是当你在Maven中运行相同的测试时,测试资源会突然消失。这是因为Eclipse没有“test classpath”的概念。

如果mvn dependency:tree显示差异,则需要检查模块pom.xml的文件。

答案 1 :(得分:0)

在(B)中,在(2)的eclipse中有一个额外的依赖,导致Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties")不返回null。它实际上应该返回null(即在(2)中找不到test.properties)。