我在Maven项目B(项目A的子项)中的测试代码具有类似
的内容String filePath = "src/main/webapp";
//do something with the filePath
当我从子项运行项目(即B级)时,上面的测试用例运行正常但是当我从父项目A运行时(即,在父级别执行mvn安装),这会失败,因为很明显没有调用文件夹父级别下的“src / main / webapp”(但在子级别可用)。
我知道我可以做一些编码检查测试用例是否从父/子模块运行但是显然我想知道其他在遇到这个问题时做了什么?
不,我不能使用类路径(出于各种无聊的原因)。
我也试过相对路径,但后来测试用例开始变得太多了。实际上是否存在解决方案呢?
更新(12月2日) - 我在webapp文件夹下有一个web.xml,并使用该web.xml在测试用例中创建一个jetty服务器。理想情况下,src / main / webapp不会放在类路径中。 WAR插件使用它来打包WAR。现在,我尝试了另一种方法,我将web.xml放在src / main / resource / console-webapp / WEB-INF / web.xml目录中,并更改了maven war插件中的webXml属性。这似乎解决了我的问题。但是,在输出WAR中我有一个web.xml和另一个冗余web.xml(由于它在类路径中而被复制)。
我尝试了“packageExcludes”和“webResources / excludes”并获得了war插件以省略第二个web.xml但仍然复制了目录“console-webapp”(尽管是空的)。有没有办法告诉maven war插件完全忽略一个目录(即什么是蚂蚁模式?)
答案 0 :(得分:7)
Maven 2约定声明所有测试资源(包括您尝试在测试中使用的文件)必须存储在src/test/resources
文件夹中。如果您遵守此约定,则可以直接从类路径获取文件。这些资源将不包含在最终包装中(JAR,WAR,EAR ......)。
当然,您可以更改目录,然后在pom.xml
中指定新的测试资源目录:
<build>
<testResources>
<testResource>
<directory>...</directory>
</testResource>
</testResources>
...
在您的问题中,您指定不能使用类路径。为什么这样?
答案 1 :(得分:2)
您尝试在测试类路径上访问的文件是什么?如果是这样,那怎么样:
public class IOUtils {
public URL getResourceAsURL(String resource) {
ClassLoader cl = getClass().getClassLoader();
return cl.getResource(resource);
}
public static InputStream getResourceAsStream(String resource) throws IOException {
ClassLoader cl = getClass().getClassLoader();
InputStream in = cl.getResourceAsStream(resource);
if (in == null)
throw new IOException("resource \"" + resource + "\" not found");
return in;
}
}