我一直在用Eclipse编写一个可以在IDE中完美运行的小项目。然后,我通过Eclipse构建了一个可运行的.jar文件(该文件应包括jar本身内部的每个依赖库)。
我在项目中使用了3个库:
然后,我使用此命令(在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);
最佳答案
FWIW,version.properties的位置最近已更改为位于com / trolltech / qt / version.properties软件包的软件包 namespace 内。原来的位置是糟糕的设计选择,现在已得到纠正。问题是,如果您的类路径中还有另一个JAR,而且它也有一个顶级文件,则ClassLoader有权认为带有该文件的JAR是该程序包的授权,因此不需要在另一个JAR中搜索该文件。包是Java中最小的可部署单元,只有专业的ClassLoader(例如OSGi中使用的那些)具有可解决Java设计这一部分的功能。
通常,您的顶级(应用程序JAR)将在列表中排在第一位,我敢打赌,您有一个或多个文件,例如/log4j.properties /commons-logging.properties等...是因为存在一个或多个文件,然后屏蔽(隐藏)qtjambi-XYZjar中的文件,使其在运行时不可见。这就是为什么当您测试某个方案时该问题可能不存在,而在尝试另一个方案时(以某种方式更改ClassPath时)却出现的原因。
我对http://qt.gitorious.org/qt-jambi/qtjambi-community/commit/f18ce5da3e30b43424bf94e49adf8c4cac0d9862所做的项目 promise 在代码中更好地说明了最近的更改,以使生活更美好。
从来没有这样的情况,您必须将Version.properties文件从QtJambi可再发行的JAR复制到类路径的其他部分(例如您案例中的顶级项目prova.jar),这是一个已得到纠正的错误。对于下一个版本。长期打算完全消除对文件的需求,而我的目标是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的邮件列表以获取公告。