Совет ограниченного использования, так как он полагается на рабочий каталог как на корень maven. И даже в этом случае вам лучше использовать target/classes/abc.txtссылку на файл, поскольку это каноническое место, куда Maven помещает файлы ресурсов после обработки (например, плагин maven-resources мог выполнить подстановку свойств в abc.txt). Намного лучше использовать abc.txt через getResource () из пути к классам.
Gyro Gearless
2
Что делать, если конечный пользователь запускает ваше приложение как исполняемый файл JAR? Тогда физического Файла вообще не будет. Это еще одна причина, по которой вы должны использовать getResource () и, например, открывать для него входной поток в зависимости от того, что вы хотите с ним делать.
Мэтью Уайз
6
Можно ли это убрать как правильный ответ? @Karol S ответил ниже - это должен быть правильный ответ (отсюда расхождение в голосовании)
DanGordon
3
Неверный ответ. Пожалуйста, обратитесь к ответу @Karol ниже
bhathiya-perera
168
Правильный способ, который действительно работает:
Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. теперь вы получаете доступ к пути, используя getPath()метод этого класса.
На нашем пути к абсолютному пути есть две проблемы:
Найденное место размещения будет не там, где лежат исходные файлы, а там, где сохранен класс. И папка ресурсов почти наверняка будет где-то в исходной папке проекта.
Те же функции для получения ресурса работают по-разному, если класс выполняется в подключаемом модуле или в пакете непосредственно в рабочей области.
Здесь исследуются обе функции, которые можно использовать для локализации папки ресурсов. Что касается class, его можно получить как статически, так и динамически.
Если проекта нет в подключаемом модуле, код при запуске в JUnit напечатает:
Итак, чтобы добраться до src / rest / resources, мы должны перемещаться вверх и вниз по дереву файлов. Можно использовать оба метода. Обратите внимание, мы не можем использовать getResource(resourceFolderName), потому что эта папка не находится в целевой папке. Надеюсь, никто не кладет ресурсы в созданные папки.
Если класс находится в пакете, который находится в плагине, результат того же теста будет:
Здесь мы можем получить абсолютный путь, только объединив результаты обеих функций. И этого мало. Между ними мы должны поместить локальный путь к месту, где находятся пакеты классов, относительно папки плагина. Возможно, вам придется что-то вставить как srcили src/test/resourceсюда.
Вы можете вставить код в свой и увидеть имеющиеся у вас пути.
Ответы:
Вы можете использовать
ClassLoader.getResource
метод, чтобы получить правильный ресурс.URL res = getClass().getClassLoader().getResource("abc.txt"); File file = Paths.get(res.toURI()).toFile(); String absolutePath = file.getAbsolutePath();
ИЛИ
Хотя это может работать не все время, более простое решение -
Вы можете создать
File
объект и использоватьgetAbsolutePath
метод:File file = new File("resources/abc.txt"); String absolutePath = file.getAbsolutePath();
источник
target/classes/abc.txt
ссылку на файл, поскольку это каноническое место, куда Maven помещает файлы ресурсов после обработки (например, плагин maven-resources мог выполнить подстановку свойств в abc.txt). Намного лучше использовать abc.txt через getResource () из пути к классам.Правильный способ, который действительно работает:
URL resource = YourClass.class.getResource("abc"); Paths.get(resource.toURI()).toFile();
Теперь не имеет значения, где физически находится файл в пути к классам, он будет найден, если ресурс на самом деле является файлом, а не записью JAR.
(Кажущееся очевидным
new File(resource.getPath())
не работает для всех путей! Путь все еще закодирован в URL!)источник
new File(resource.toURI()).getAbsolutePath();
(т.е. я не думаю, что вам нужен объект Path?)new File(YourClass.class.getResource("abc").toURI().getPath())
если бы захотели..getResource("/abc")
Вам нужно указать путь, начинающийся с
/
URL resource = YourClass.class.getResource("/abc"); Paths.get(resource.toURI()).toFile();
источник
Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. теперь вы получаете доступ к пути, используя
getPath()
метод этого класса.ClassLoader classLoader = getClass().getClassLoader(); String path = classLoader.getResource("chromedriver.exe").getPath(); System.out.println(path);
источник
Чтобы вернуть файл или путь к файлу
URL resource = YourClass.class.getResource("abc"); File file = Paths.get(resource.toURI()).toFile(); // return a file String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path
источник
На нашем пути к абсолютному пути есть две проблемы:
Следующий код даст нам все полезные пути:
URL localPackage = this.getClass().getResource(""); URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation(); String localDir = localPackage.getPath(); String loaderDir = urlLoader.getPath(); System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
Здесь исследуются обе функции, которые можно использовать для локализации папки ресурсов. Что касается
class
, его можно получить как статически, так и динамически.Если проекта нет в подключаемом модуле, код при запуске в JUnit напечатает:
loaderDir = /C:.../ws/source.dir/target/test-classes/ localDir = /C:.../ws/source.dir/target/test-classes/package/
Итак, чтобы добраться до src / rest / resources, мы должны перемещаться вверх и вниз по дереву файлов. Можно использовать оба метода. Обратите внимание, мы не можем использовать
getResource(resourceFolderName)
, потому что эта папка не находится в целевой папке. Надеюсь, никто не кладет ресурсы в созданные папки.Если класс находится в пакете, который находится в плагине, результат того же теста будет:
loaderDir = /C:.../ws/plugin/bin/ localDir = /C:.../ws/plugin/bin/package/
Итак, мы снова должны идти вверх и вниз по дереву папок.
Наиболее интересен случай, когда пакет запускается в плагине. В качестве теста плагина JUnit для нашего примера. Результат:
loaderDir = /C:.../ws/plugin/ localDir = /package/
Здесь мы можем получить абсолютный путь, только объединив результаты обеих функций. И этого мало. Между ними мы должны поместить локальный путь к месту, где находятся пакеты классов, относительно папки плагина. Возможно, вам придется что-то вставить как
src
илиsrc/test/resource
сюда.Вы можете вставить код в свой и увидеть имеющиеся у вас пути.
источник