При выполнении JAR получите ExceptionInInitializerError: version.properties не найдено

Я писал небольшой проект в Eclipse, который отлично работает в среде IDE. Затем я создал исполняемый файл.jar через Eclipse (который должен включать каждую библиотеку зависимостей внутри самого jar-файла).

Я использую 3 библиотеки в моем проекте:

  • derby.jar
  • qtjambi-4.7.1.jar
  • qtjambi-win32-msvc2008-4.7.1.jar

Затем я использую эту команду (в Windows):

java -jar prova.jar

И я получаю это:

Connected to database

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.ExceptionInInitializerError: version.properties not found!
    at com.trolltech.qt.Utilities.<clinit>(Unknown Source)
    at com.trolltech.qt.QtJambi_LibraryInitializer.<clinit>(Unknown Source)
    at com.trolltech.qt.QtJambiObject.<clinit>(Unknown Source)
    at WAAAGH.main(WAAAGH.java:52)
    ... 5 more


Как вы можете видеть, derby.jar работает должным образом ("Подключен к базе данных"), но в Qt-Jambi есть ошибка, которую я не могу понять. Любая идея?


РЕДАКТИРОВАТЬ: WAAAGH является классом, содержащим метод main, строка 52 состоит из:

QApplication.initialize(args);

2 ответа

Решение

FWIW расположение version.properties было недавно изменено, чтобы оно находилось внутри пространства имен пакетов com/trolltech/qt/version.properties. Старое местоположение было плохим выбором дизайна, и теперь оно исправлено. Проблема заключается в том, что если у вас есть другой JAR-файл в вашем classpath, который также имеет файл верхнего уровня, то ClassLoader имеет право считать, что JAR-файл с этим файлом является авторским для пакета, и ему не нужно искать другой JAR-файл для этого файла. Пакет - это минимальный развертываемый модуль в Java, только специальные загрузчики классов (такие как те, которые используются в OSGi) имеют функции, позволяющие обойти эту часть проекта Java.

Обычно ваш верхний уровень (JAR приложения) будет первым в списке, и я уверен, что в этом JAR у вас есть один или несколько файлов, таких как /log4j.properties /commons-logging.properties и т. Д.... это потому, что тогда существует один или несколько файлов. маскирует (скрывает) файл в qtjambi-XYZjar от просмотра во время выполнения. Вот почему проблема может не существовать при тестировании определенного сценария, но может появиться при попытке другого (когда вы каким-либо образом изменили ClassPath).

Моя приверженность проекту на http://qt.gitorious.org/qt-jambi/qtjambi-community/commit/f18ce5da3e30b43424bf94e49adf8c4cac0d9862 лучше объясняет в коде последние изменения, чтобы сделать жизнь лучше.

Никогда не должно было случиться, что вам придется скопировать файл version.properties из распространяемых JAR-файлов QtJambi в какую-то другую часть пути к классам (например, в качестве верхнего уровня для проекта prova.jar), это ошибка, которая была исправлена. для следующего выпуска. Это долгосрочное намерение полностью устранить необходимость в файле, и я нахожусь на 80% с этой целью, так как часть этой работы по совместному сосуществованию нескольких собственных JAR-файлов в одном и том же Class Path значительно упростит развертывание и руководства по началу работы; а также заставляет их играть с OSGi и Eclipse красиво из коробки.

Однако еще не было сделано никаких релизов, чтобы включить это изменение, но я очень близок (в течение 30 дней после этого для Qt 4.7.4).

Предупреждение о подключении открытого источника: рассмотрите возможность присоединения к списку рассылки по адресу http://lists.qt.nokia.com/pipermail/qt-jambi-interest/ из http://lists.qt.nokia.com/mailman/listinfo для объявлений.,

Как QtJambiObject загружается? Вы упаковали это в своем prova.jar? Отсутствующий файл version.properties должен быть частью той же банки на верхнем уровне (не в любом subdir). Кажется, вы не упаковали его внутрь prova.jar на высшем уровне. Смотрите это для объяснения того, как он загружается.

Возможно, вам лучше указать все jar и основной класс в командной строке:

java -classpath prova.jar;derby.jar;qtjambi-4.7.1.jar;qtjambi-win32-msvc2008-4.7.1.jar <your main class>

заменить; с: если вы работаете на *nix

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