3

我一直在 Eclipse 中编写一个在 IDE 中完美运行的小项目。然后我通过 Eclipse 构建了一个可运行的 .jar 文件(它应该包括 jar 本身内的每个依赖库)。

我在我的项目中使用了 3 个库:

  • 德比罐子
  • 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);
4

2 回答 2

2

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 上运行

于 2011-09-30T10:32:55.927 回答
1

FWIW version.properties 的位置最近已更改为在包 com/trolltech/qt/version.properties 的包命名空间内。旧位置是一个糟糕的设计选择,现在已得到纠正。问题是,如果您的类路径中有另一个 JAR 也有一个顶级文件,那么 ClassLoader 有权认为带有该文件的 JAR 对包是权威的,它不需要在另一个 JAR 中搜索该文件。包是 Java 中最小的可部署单元,只有专业的类加载器(例如在 OSGi 中使用的类加载器)具有围绕 Java 设计的这一部分工作的特性。

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

我在http://qt.gitorious.org/qt-jambi/qtjambi-community/commit/f18ce5da3e30b43424bf94e49adf8c4cac0d9862上对该项目的承诺更好地在代码中解释了最近的更改以使生活更美好。

永远不会出现您必须将 version.properties 文件从 QtJambi 可再发行 JAR 复制到类路径的其他部分(如您的情况中的顶级项目 prova.jar)的情况,这是一个已更正的错误为下一个版本。完全消除对文件的需求是长期的意图,我 80% 都实现了这个目标,作为工作的一部分,使多个本地 JAR 共存于同一个类路径中将大大简化部署和入门指南;以及让他们开箱即用地与 OSGi 和 Eclipse 一起玩。

但是尚未发布包含此更改的版本,但我非常接近(在 Qt 4.7.4 这样做的 30 天内)。

Open Source plug alert: Please consider joining the mailing list at http://lists.qt.nokia.com/pipermail/qt-jambi-interest/ from http://lists.qt.nokia.com/mailman/listinfo for announcements.

于 2011-09-30T17:45:37.147 回答