WedX - журнал о программировании и компьютерных науках

Относительный путь для экспорта библиотеки в 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 у нас были простые функции для получения относительных путей в соответствии с местоположением во время выполнения. Как я могу ссылаться на файлы таким образом, чтобы он фиксировал путь среды выполнения, чтобы я мог безопасно ссылаться на них, и путь будет решаться динамически?

Для тех, кто так хочет пометить этот вопрос как дубликат, пожалуйста, сначала внимательно прочитайте. Я НЕ спрашиваю, как ЧИТАТЬ файлы из ресурсов!

23.08.2020

  • Вы должны ссылаться на них как на ресурсы пути к классам. 23.08.2020
  • Не могли бы вы уточнить немного больше, пожалуйста? Я знал, что могу загружать пути к ресурсам, используя что-то вроде getClass().getResource("/file.txt"), можете ли вы указать мне, как ссылаться на них как на ресурсы пути к классам? Я создал папку ресурсов и файл .properties, но как мне это сделать? 23.08.2020

Ответы:


1

Чтобы использовать файл .txt, присутствующий в пути к классам, нам нужно убедиться, что файл .txt присутствует в каталоге, представленном путем к классам.

Предположим, что у вас есть все файлы классов, сгенерированные в каталоге с именем /home/abcuser/target.

Для простоты мы поместим файл .txt на корневой уровень целевого каталога.

Основной класс, скажем, TestFileAccess.class(класс с основным методом)

Чтобы выполнить основной класс, присутствующий в целевом каталоге, вы можете использовать следующую команду

    java -cp /home/abcuser/target TestFileAccess

Теперь путь к классам в этом случае /home/abcuser/target

Чтобы получить доступ к ресурсам в пути к классам, вы можете пойти двумя путями.

  • Методы ClassLoader.getSystemResource и ClassLoader.getSystemResourceAsStream.
  • Class.getResource и Class.getResourceAsStream

Основное различие между версиями методов ClassLoader и Class заключается в способе интерпретации относительных путей.

Методы класса разрешают относительный путь в каталоге, который соответствует пакету классов. Методы ClassLoader обрабатывают относительные пути так, как если бы они были абсолютными; то есть разрешить их в корневом каталоге пути к классам

Используя ClassLoader, вы можете использовать приведенный ниже фрагмент

    InputStream inputStream = ClassLoader.getSystemResourceAsStream("file.txt");

Чтобы явно указать ресурс как файл пути к классам, вы можете добавить путь к ресурсу в путь к классам при выполнении кода Java.
Допустим, ваш файл ресурсов.txt находится в /home/abcuser/resources.
Вы можете добавить путь ресурса к пути к классам во время запуска выполнения java, как показано ниже

    java -cp "/home/abcuser/target:/home/abcuser/resources" TestFileAccess
23.08.2020
  • Я не уверен, что это действительно отвечает на мой вопрос. Вы считаете, что я хочу получить доступ к файлам пути к классам, когда это не так. Я хочу ссылаться на свои файлы как на ресурсы пути к классам, как упоминал Пит. Если простое обращение к таким файлам уже не работает... так ли это? 23.08.2020
  • @BrunoGiannotti Я отредактировал пример того, как явно добавить путь к ресурсу в ваш путь к классам. 24.08.2020
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]