Относительный путь для экспорта библиотеки в Java

#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.