执行JAR时,获取ExceptionInInitializerError:找不到version.properties

时间:2011-09-30 09:59:01

标签: java eclipse jar derby qt-jambi

我一直在Eclipse中编写一个小项目,它在IDE中完美运行。然后我通过Eclipse构建一个可运行的.jar文件(它应该包含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 个答案:

答案 0 :(得分:2)

QtJambiObject如何加载?你把它打包在prova.jar里吗?丢失的文件version.properties应该是顶层同一个jar的一部分(不在任何子目录中)。看来你还没有将它打包在顶级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>

替换; with:如果你在* nix上运行

答案 1 :(得分:1)

FWIW最近将version.properties的位置更改为在bundle com / trolltech / qt / version.properties的包命名空间内。旧的位置是一个糟糕的设计选择,现在已经纠正。问题是如果你的类路径中有另一个JAR也有一个顶层文件,那么ClassLoader有权认为带有该文件的JAR是该程序包的授权,它不需要为该文件搜索另一个JAR。包是Java中的最小可部署单元,只有专业的ClassLoader(例如OSGi中使用的那些)具有解决Java设计的这一部分的功能。

通常你的toplevel(应用程序JAR)将在列表中排在第一位,我在那个JAR中打赌你有一个或多个文件,比如/log4j.properties /commons-logging.properties等...这是因为一个或多个文件然后存在它然后掩盖(隐藏)qtjambi-XYZjar中的文件在运行时被看到。这就是为什么在测试某个场景时可能不存在该问题但在您尝试另一个场景时出现的问题(当您以某种方式更改ClassPath时)。

我对http://qt.gitorious.org/qt-jambi/qtjambi-community/commit/f18ce5da3e30b43424bf94e49adf8c4cac0d9862项目的承诺更好地解释了最近改变生活方式的改变。

永远不应该是你必须将QtJambi可再发行的JAR中的version.properties文件复制到类路径的其他部分(就像你的案例中的顶级项目prova.jar)这是一个bug已被更正为下一个版本。长期目的是完全消除对文件的需求,并且我80%有这个目标,作为工作的一部分,使多个本地JAR共存于同一个类路径中将大大简化部署和入门指南;以及让它们与OSGi和Eclipse很好地开箱即用。

然而,尚未发布任何已包含此更改的版本,但我非常接近(在Qt 4.7.4的30天内)。

开源插件提醒:请考虑加入http://lists.qt.nokia.com/pipermail/qt-jambi-interest/http://lists.qt.nokia.com/mailman/listinfo邮件列表,以获取公告。