При выполнении JAR получить ExceptionInInitializerError: version.properties not found

Я писал небольшой проект в 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 - это класс, содержащий основной метод, строка 52 состоит из:

QApplication.initialize(args);

person Alex    schedule 30.09.2011    source источник
comment
WAAAGH - один из ваших классов?   -  person Maverik    schedule 30.09.2011
comment
Да, это класс, содержащий основной метод. В строке 52 пытаюсь запустить qt jambi   -  person Alex    schedule 30.09.2011
comment
Вы проверили, есть ли у вас файл version.properties в этих банках с qt-jambi?   -  person Xavi López    schedule 30.09.2011
comment
Где в файле version.properties? это упаковано в банку?   -  person Santosh    schedule 30.09.2011


Ответы (2)


FWIW расположение version.properties было недавно изменено, чтобы находиться внутри пространства имен пакетов пакетов com / trolltech / qt / version.properties. Старое местоположение было неудачным выбором, и теперь это исправлено. Проблема в том, что если у вас есть другой JAR в вашем пути к классам, который также имеет файл верхнего уровня, тогда 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-файлов сосуществующих в одном и том же пути к классам значительно упростит развертывание и руководства по началу работы; а также заставить их играть с OSGi и Eclipse прямо из коробки.

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

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

person Darryl Miles    schedule 30.09.2011
comment
Может ли это быть основной причиной того, что я испытываю сегодня, и спросил здесь: stackoverflow.com/questions/8929559/ - person Dexygen; 19.01.2012

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

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

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

заменить; with: если вы используете * nix

person Miserable Variable    schedule 30.09.2011