Как заставить Maven прочитать файл из моей папки ресурсов - PullRequest
0 голосов
/ 28 февраля 2019

Я успешно использую 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 найти мои файлы ресурсов.

Любая помощь будет принята с благодарностью!Спасибо

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вот моя файловая структура проекта Maven, созданного из архива быстрого запуска, с добавлением 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());
    }
}
0 голосов
/ 28 февраля 2019

A File действительно файл в файловой системе.Для ресурса , который может быть файлом, заархивированным в jar-файле и имеющим путь к пути к классу, вам нужно что-то еще.

Традиционно можно использовать более общий InputStream вместоФайл.

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"))

0 голосов
/ 28 февраля 2019

Насколько я понимаю, 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))); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...