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