GetResourceAsStream не загружает ресурс

В проекте, над которым я сейчас работаю, используется старое приложение, содержащееся в файле .jar. Одна из обязанностей этого приложения заключается в том, что он обновляет базу данных при внесении изменений в файлы конфигурации. Каждый раз, когда я пытаюсь запустить этот файл (который является простым расширением Ant Task), я получаю исключение, заложенное в начале процесса. Я декомпилировал ответственный Java файл и обнаружил, что здесь возникает исключение. Я не знаю, в чем проблема, поскольку "hibernate.cfg.xml" содержится в том же .jar файле, что и .class, выбрасывая исключение.

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream in = loader.getResourceAsStream("hibernate.cfg.xml");
if (in == null) { throw new RuntimeException("Couldn't find built in hibernate config");
}

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

Конечно, любое решение должно быть внешним, так как клиент уже имеет эту сборку программы в процессе производства.

5 ответов

Загружаете ли вы его из корневого каталога, и вам нужно "/hibernate.cfg.xml" вместо простого hibernate.cfg.xml?


getResourceAsStream() ожидает, что файл будет в том же пакете, что и класс, который был источником ClassLoader. Ваш файл в правильном пакете?

Doh. Не прочитал вопрос полностью. Пожалуйста, проигнорируйте это.


попробовать

InputStream in = YourClass.class..getResourceAsStream("hibernate.cfg.xml");

это будет работать, если класс находится в том же банке, что и файл cfg.

изменить если вы не можете перестроить приложение, вам нужно будет добавить банку в загрузчик классов bootstrap. это очень уродливо. вы можете сделать это, запустив jvm (играйте с точными аргументами, вам может понадобиться добавить rt.jar из вашего jre к нему).

-Xbootclasspath your.jar

Ваша проблема в том, что в коде используется загрузчик классов, загружающий класс Thread, который, скорее всего, является загрузчиком классов bootstrap. и что теперь вы находитесь в более сложной среде (сервер приложений?), которая загружает вашу банку с помощью другого загрузчика классов. поэтому загрузчик bootstrap не может найти ваш ресурс.


Возможно, что загрузчик классов не может открывать файлы, содержащиеся в файле jar. Попробуйте одну из двух вещей: 1) попробуйте извлечь файл jar и запустить его из файловой системы или 2) если манифест jar имеет запись ClassPath, попробуйте извлечь hibernate.cfg.xml в каталог в пути к классам и посмотреть, работает.


По-видимому, файл hibernate.cfg.xml не находится в исходном корневом каталоге JAR файла, но он помещается внутри пакета. Вам также необходимо указать путь к каталогу в имени ресурса.

licensed under cc by-sa 3.0 with attribution.