Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

java.io.FileNotFoundException


(Александр Беликов) #1

Всем привет. В проекте имеется файл file.json. Расположен вот тут - /src/test/java/resources/file.json Из под винды этот файл прекрасно парсится (src\test\java\resources\) При запуске под linux получаю - java.io.FileNotFoundException (No such file or directory). Под Linux я прописал путь след. образом - /home/alex/Project/src/test/java/resources/file.json Не пойму что не так делаю, почему он его не находит? Спасибо.


(Sergey Korol) #2

Если правильно настроить среду, можно включить файл ресурсов в classpath, что позволит вам вообще не указывать абсолютный путь. Например, в IntelliJ IDEA в настройках компилятора можно указать расширения файлов ресурсов, которые он будет заносить в classpath.


(Александр Беликов) #3

Спасибо за ответ, как раз использую IDEA, но дело в том что тесты выполняются на виртуальных машинах. Если можно поподробней про настройку компилятора?


(Sergey Korol) #4

Обновил предыдущий пост скрином.


(Александр Беликов) #5

У меня в точности как у Вас на скрине.


(Sergey Korol) #6

Правильно, это дефолтные настройки, но там ведь нет расширения json, который вам нужен. :blush:


(Александр Беликов) #7

Такс…добавил !?*.json. Как в таком случае будет выглядеть мой код? Т.е как указать на файл?


(Sergey Korol) #8

Просто по имени обращайтесь, без пути.


(Александр Беликов) #9

Попробую конечно, но не уверен что сработает. Код коммитится и пушится в удаленную ветку, на виртуалках этот код фетчится и выполняется. Как тут поможет настройка IDEA, виртуалка ведь все равно будет искать файл в репозитории. Ладно, сейчас запущу, попробую, отпишу что получилось.


(Sergey Korol) #10

Так я не понял, файл физически лежит в проекте или нет? Вы разве ресурсы не пушите в репозиторий?


(Александр Беликов) #11

Да, конечно, файл лежит в репе проекта. Project/src/test/java/resources/file.json Все изменения пушатся


(Александр Беликов) #12

Увы. java.io.FileNotFoundException: file.json (No such file or directory)


(Sergey Korol) #13

А вам json для грида нужен?


(Александр Беликов) #14

да.


(sidelnikovmike) #15

1)по идее, если вы используете мавен проект, то папка resources должна быть в определенном месте.
чаще всего это src/main/resources ( возможно src/test/resources тоже подойдет). Правда я могу ошибаться конечно :smile:

2)тогда по идее вы можете нормально считать файл через следующий код:
YourClass.class.getClassLoader().getResourceAsStream(pathToFile)
где pathToFile - это будет в вашем случае просто file.json. Если он будет внутри какой то папки, то будет : имя_папки/file.json
Попробуйте


(Александр Беликов) #16

У меня 2 папки resources в проекте. Одна как вы и сказали - src/main/resources - созданная maven-ом (в ней прописан адрес приложения), вторая папка resources - /src/test/java/resources - созданная мной. Именно там и лежат файлы *.json. Вы предлагаете перенести *.json-ы в папку, которую создал Maven? Вот так реализован механизм чтения адреса проекта из файла application.properties. Сделать по аналогии?

private static String PROP_FILE = "/application.properties";

public static String loadProperty(String name) {

    Properties properties = new Properties();
    try {
        properties.load(PropertyLoader.class.getResourceAsStream(PROP_FILE));
    } catch (IOException e) {
        e.printStackTrace();
    }

(sidelnikovmike) #17

Ага. Попробуйте перенести


(Александр Беликов) #18

Найдено решение:

file = (isWindows() ? "src\\test\\java\\resources\\" : "src/test/java/resources/") + file;

public static boolean isWindows(){
    String os = System.getProperty("os.name").toLowerCase();
    return (os.contains("win"));
}

(Jane Tymoschuk) #19

я обычно такое обхожу следующим образом

new File("").getAbsolutePath() + File.separator+"localFolderName"+File.separator+"fileName"

где:
new File("").getAbsolutePath() - возвращает полный путь к папке, откуда запускается проект, будь то идея или мавен билд.
А File.separator позволяет не привязываться к операционной системе

Таким образом не придется добавлять еще пути к файлу, если появится еще одно окружение, на котором нужно запускать тесты

Да и просто за счет File.separator конструкция

file = (isWindows() ? "src\\test\\java\\resources\\" : "src/test/java/resources/") + file;

упрощается до

file =  "src" + File.separator + "test" + File.separator + "java" + File.separator + "resources" + File.separator + file;