我一直很高兴地使用JUnit运行测试,一切都很好。
但是,我现在需要使用Maven,但是由于某种原因,它找不到我的任何资源文件。
文件位于预期位置:src / main / resources
我正在使用以下代码尝试读取文件:
public Map<String, String> readCsv(String filename) {
Map<String, String> headersAsMap;
CSVDataManipulator csvDataManipulator = new CSVDataManipulator();
ClassLoader classLoader = getClass().getClassLoader();
String wrkbook = new File(classLoader.getResource(filename).getFile()).toString();
headersAsMap = csvDataManipulator.getAllRecordsAsMap(wrkbook);
return headersAsMap;
}
但是,请尝试尝试它找不到文件。 我尝试了很多不同的代码,并尝试将文件移动到不同的位置,但是我无法让Maven找到我的资源文件。
任何帮助将不胜感激! 谢谢
答案 0 :(得分:0)
据我所知,classLoader.getResource(..)希望文件位于与类的包匹配的文件夹结构中。因此,如果您的课程包是com.matt.stuff,则必须将csv文件放入src / main / resources / com / matt / stuff。
或者您可以使用它来获取您的csv文件:
private static String readFile(String fileName) throws IOException {
//filename can be src/main/resources/my-csv.csv
return new String(Files.readAllBytes(Paths.get(fileName)));
}
答案 1 :(得分:0)
这是我的基于Maven项目的文件结构,该项目是根据quick-start-archetype创建的,并添加了comons-io作为依赖项:
src
src/main
src/main/java
src/main/java/com
src/main/java/com/essexboy
src/main/java/com/essexboy/App.java
src/main/resources
src/main/resources/dir1
src/main/resources/dir1/test.txt
src/main/resources/dir2
src/main/resources/dir2/test.txt
src/main/resources/test.txt
src/test
src/test/java
src/test/java/com
src/test/java/com/essexboy
src/test/java/com/essexboy/AppTest.java
这是我的考试
public class AppTest {
@Test
public void shouldAnswerWithTrue() throws Exception {
StringWriter writer = new StringWriter();
IOUtils.copy(getClass().getResourceAsStream("/test.txt"), writer, Charset.defaultCharset());
assertEquals("from root", writer.toString().trim());
writer = new StringWriter();
IOUtils.copy(getClass().getResourceAsStream("/dir1/test.txt"), writer, Charset.defaultCharset());
assertEquals("from dir1", writer.toString().trim());
writer = new StringWriter();
IOUtils.copy(getClass().getResourceAsStream("/dir2/test.txt"), writer, Charset.defaultCharset());
assertEquals("from dir2", writer.toString().trim());
}
}
答案 2 :(得分:0)
File
确实是文件系统上的文件。对于资源(可能是压缩在jar中的文件,并且在类路径上具有路径),您还需要其他内容。
传统上,人们会使用更通用的InputStream代替File。
InputStream in = getClass().getResourceAsStream("/.../x.csv"); // Path on the class path
使用比Path
更通用的新类File
,您可以处理多个(虚拟)文件系统:
URL url = getClass().getResource("/.../x.csv"); // Path on the class path
Path path = Paths.get(url.toURI());
Files.copy(path, Paths.get("..."));
幸运的是,您的CSVManipulator除了应使用文件参数化外,还应使用InputStream
或Reader
(new InputStreamReader(in, "UTF-8")
)