2011-09-30 84 views
3

我一直在Eclipse中编写一个在IDE中完美运行的小项目。然后,我通过Eclipse构建了一个可运行的.jar文件(它应该包括jar本身内的每个依赖库)。当执行JAR时,得到ExceptionInInitializerError:version.properties not found

我用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的占碑的错误,我无法理解。任何想法?


编辑: WAAAGH是包含main方法的类,线52在于:

QApplication.initialize(args); 
+0

WAAAGH是您的课程之一吗? – Maverik

+0

是的,它是包含主要方法的类。在第52行,我尝试启动qt jambi – Alex

+2

您是否检查过在这些qt-jambi jar文件中有文件'version.properties'? –

回答

1

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

通常你的上层应用程序(应用程序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)这是一个错误该版本已在下一版本中得到纠正。长期目的是完全消除对文件的需求,并且我有80%的目标,作为这项工作的一部分,使多个本机JAR共存于同一个Class Path中将大大简化部署和入门指南;以及让他们很好地使用OSGi和Eclipse。

但是目前还没有发布包含此更改的版本,但我非常接近(在为Qt 4.7.4这样做的30天内)。

开源插件警报:请考虑加入邮件列表http://lists.qt.nokia.com/pipermail/qt-jambi-interest/http://lists.qt.nokia.com/mailman/listinfo公告。

+0

这可能是我今天遇到的问题的根源,并在这里问:http://stackoverflow.com/questions/8929559/nullpointerexception-from-java-lang-j9vminternals –

2

如何QtJambiObject得到装入?你有没有把它打包在你的prova.jar?缺少的文件version.properties应该是顶级相同jar的一部分(不在任何subdir中)。看来你还没有把它打包在prova.jar的顶层。有关如何加载的说明,请参阅this

你可能会更好指定命令行所有的罐子和主类:

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

更换;如果您正在运行* nix