Всем привет. В проекте имеется файл 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 Не пойму что не так делаю, почему он его не находит? Спасибо.
Если правильно настроить среду, можно включить файл ресурсов в classpath, что позволит вам вообще не указывать абсолютный путь. Например, в IntelliJ IDEA в настройках компилятора можно указать расширения файлов ресурсов, которые он будет заносить в classpath.
Спасибо за ответ, как раз использую IDEA, но дело в том что тесты выполняются на виртуальных машинах. Если можно поподробней про настройку компилятора?
Обновил предыдущий пост скрином.
У меня в точности как у Вас на скрине.
Правильно, это дефолтные настройки, но там ведь нет расширения json, который вам нужен.
Такс…добавил !?*.json. Как в таком случае будет выглядеть мой код? Т.е как указать на файл?
Просто по имени обращайтесь, без пути.
Попробую конечно, но не уверен что сработает. Код коммитится и пушится в удаленную ветку, на виртуалках этот код фетчится и выполняется. Как тут поможет настройка IDEA, виртуалка ведь все равно будет искать файл в репозитории. Ладно, сейчас запущу, попробую, отпишу что получилось.
Так я не понял, файл физически лежит в проекте или нет? Вы разве ресурсы не пушите в репозиторий?
Да, конечно, файл лежит в репе проекта. Project/src/test/java/resources/file.json Все изменения пушатся
Увы. java.io.FileNotFoundException: file.json (No such file or directory)
А вам json для грида нужен?
да.
1)по идее, если вы используете мавен проект, то папка resources должна быть в определенном месте.
чаще всего это src/main/resources ( возможно src/test/resources тоже подойдет). Правда я могу ошибаться конечно
2)тогда по идее вы можете нормально считать файл через следующий код:
YourClass.class.getClassLoader().getResourceAsStream(pathToFile)
где pathToFile - это будет в вашем случае просто file.json. Если он будет внутри какой то папки, то будет : имя_папки/file.json
Попробуйте
У меня 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();
}
Ага. Попробуйте перенести
Найдено решение:
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"));
}
я обычно такое обхожу следующим образом
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;