Припустимо стандартне налаштування maven.
Скажімо, у вашій папці ресурсів є файл abc
.
На Java, як я можу отримати абсолютний шлях до файлу, будь ласка?
Припустимо стандартне налаштування maven.
Скажімо, у вашій папці ресурсів є файл abc
.
На Java, як я можу отримати абсолютний шлях до файлу, будь ласка?
Відповіді:
Ви можете використовувати 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")
Створіть екземпляр 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
сюди.
Ви можете вставити код у свій і побачити шляхи, які у вас є.