При выполнении JAR получите ExceptionInInitializerError: version.properties не найдено - PullRequest
3 голосов
/ 30 сентября 2011

Я писал небольшой проект в 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 есть ошибка, которую я не могу понять Есть идеи?


EDIT: WAAAGH - класс, содержащий метод main, строка 52 состоит из:

QApplication.initialize(args);

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

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

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

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

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

1 голос
/ 30 сентября 2011

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

...