getResourceAsStream не загружает ресурс - PullRequest
3 голосов
/ 22 марта 2010

В проекте, над которым я сейчас работаю, используется старое приложение, содержащееся в файле .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 ]

3 голосов
/ 22 марта 2010

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

2 голосов
/ 22 марта 2010

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

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

1 голос
/ 22 марта 2010

1001 * попробовать *

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

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

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

-Xbootclasspath your.jar

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

0 голосов
/ 22 марта 2010

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

0 голосов
/ 22 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...