#java #relative-path
#java #относительный путь
Вопрос:
Я пытаюсь экспортировать .JAR для использования в качестве библиотеки в других проектах. Проблема в том, что мне нужно использовать относительные пути при обращении к файлам внутри этой библиотеки, но единственными решениями, которые я нашел, были использование абсолютных путей, таких как:
private static final String FILE = new File("").getAbsolutePath().concat("/src/bla/file.txt");
Очевидно, что всякий раз, когда я пытаюсь запустить эту строку кода как экспортированную библиотеку, я получаю что-то вроде DRIVE/project/src/bla/file.txt
, что неверно, поскольку это .JAR может находиться где угодно внутри DRIVE/projects
подобного DRIVE/projects/lib/myLib.jar
.
В Nodejs у нас были простые функции для извлечения относительных путей в соответствии с местоположением среды выполнения. Как я могу ссылаться на файлы таким образом, чтобы он фиксировал «путь выполнения», чтобы я мог безопасно ссылаться на них, и путь будет решаться динамически?
Для тех, кто так хочет пометить этот вопрос как дублирующий, пожалуйста, сначала внимательно прочитайте. Я НЕ спрашиваю, как ЧИТАТЬ файлы из ресурсов!
Комментарии:
1. Вы должны ссылаться на них как на ресурсы classpath.
2. Не могли бы вы рассказать немного больше, пожалуйста? Я знал, что могу загружать пути к ресурсам, используя что-то вроде
getClass().getResource("/file.txt")
, можете ли вы указать мне, как ссылаться на них как на ресурсы classpath? Я создал папку ресурсов и файл .properties, но все же, как я мог этого добиться?
Ответ №1:
Чтобы использовать «file.txt «присутствует в classpath, нам нужно убедиться, что «file.txt » присутствует в каталоге, представленном classpath.
Предположим, у вас есть все файлы классов, сгенерированные в каталоге с именем «/home/abcuser / target».
Для простоты мы разместим file.txt на корневом уровне целевого каталога.
Основным классом является say TestFileAccess.class (класс с методом main)
Для выполнения основного класса, присутствующего в целевом каталоге, вы можете использовать приведенную ниже команду
java -cp /home/abcuser/target TestFileAccess
Теперь путь к классу в этом случае равен /home/abcuser/target
Чтобы получить доступ к ресурсам в classpath, вы можете воспользоваться двумя способами.
- Методы ClassLoader.getSystemResource и ClassLoader.getSystemResourceAsStream.
- Class.getResource и Class.getResourceAsStream
Основное различие между версиями методов ClassLoader и Class заключается в способе интерпретации относительных путей.
Методы класса разрешают относительный путь в «каталоге», который соответствует пакету classes. Методы ClassLoader обрабатывают относительные пути так, как если бы они были абсолютными; то есть разрешают их в «корневом каталоге» classpath
Используя ClassLoader, вы можете использовать приведенный ниже фрагмент
InputStream inputStream = ClassLoader.getSystemResourceAsStream("file.txt");
Чтобы явно ссылаться на ресурс как на файл classpath, вы можете добавить путь к ресурсу в classpath во время выполнения кода Java.
Допустим, ваш ресурс «file.txt » находится в /home/abcuser/resources.
Вы можете добавить путь к ресурсу в classpath во время запуска выполнения java, как показано ниже
java -cp "/home/abcuser/target:/home/abcuser/resources" TestFileAccess
Комментарии:
1. Я не уверен, что это действительно отвечает на мой вопрос. Вы считаете, что я хочу получить доступ к файлам classpath, когда это не так. Я хочу ссылаться на свои файлы как на ресурсы classpath, как упоминал Пит. Если простое обращение к файлам, подобным этому, уже не приводит к job…is это так?
2. @BrunoGiannotti Я отредактировал пример того, как явно добавить путь к ресурсам в ваш classpath.