Доступ к getResourceAsStream () зависимости jar

У меня 2 проекта; A и B (оба проекта maven). A упакован как jar и добавлен как зависимость к проекту B. Оба проекта имеют файл config.properties, расположенный в их папке / resources. При запуске проекта B следующий код, расположенный в проекте A, загружает папку ресурсов B:

Properties configProps = new Properties();
    try {
        InputStream in = classInA.class.getResourceAsStream("/config.properties");
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = null;
        while ((line = br.readLine()) != null)
        {
            String values[] = line.split(" = ", 2);
            configProps.setProperty(values[0], values[1]);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

У меня такой же блок кода в методе проекта B, и он правильно обращается к файлу config.properties B. Любая идея, как я могу это исправить, или, может быть, у вас есть лучшее представление о том, как получить доступ к файлам в зависимостях jar как при запуске как jar, так и в среде IDE (Intellij)

Обновлено: пакеты следующие

  • com.nicky.projectA
  • com.nicky.projectB

Стек ошибок не выводится, поскольку проект B находит файл config.properties, однако он находится в com.nicky.projectB / resources, а не в папке ресурсов projectA.

Обновлено: изменение имени файла одного из свойств, похоже, решило проблему. Я предполагаю, что сначала он выполнял поиск в родительском проекте и по умолчанию использовал этот файл свойств, поскольку у них было то же имя.

очевидно, что и A, и B имеют разные пакеты, поэтому необходимо указать правильный путь в соответствии с пакетом проекта. пожалуйста, добавьте стек ошибок @Nicky

Afgan 06.04.2018 15:02

Отредактировал исходный пост. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

Nicky Buttigieg 06.04.2018 15:06

согласно отредактированному вопросу нужно указать вот так -> classInA.class.getResourceAsStream ("com.nicky.projectB / resou‌ rces / config.properti‌ es");

Afgan 06.04.2018 15:08

Это привело к исключению NullPointerException как при запуске непосредственно из проекта B в среде IDE, так и при запуске проекта A в среде IDE.

Nicky Buttigieg 06.04.2018 15:12

Вы знаете о методе Properties.load? Он в значительной степени делает именно то, что делает ваш код.

VGR 06.04.2018 15:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
318
1

Ответы 1

getResourceAsStream("/config.properties") ищет config.properties в пути к классам в корне.

Неважно, находится ли код, вызывающий метод, в A.jar или B.jar, и находится ли файл в A.jar или B.jar.

Он сканирует путь к классам и возвращает первый найденный файл config.properties. Если A.jar находится перед B.jar в classspath, то будет возвращен файл конфигурации A. Если B.jar находится перед A.jar в пути к классам, то будет возвращен файл конфигурации B.

Именно эта проблема является причиной существования пакетов: чтобы избежать конфликтов имен. Файл конфигурации A не должен находиться в корне. Он должен быть в том же пакете, что и классы A (например, com.mycompany.a). И файл конфигурации B должен быть в том же пакете, что и классы B (например, com.mycompany.b).

После того, как вы правильно использовали пакеты таким образом, как вы, вероятно, уже делаете это для классов, у вас больше не будет конфликтов имен.

Другие вопросы по теме