【问题标题】:When executing JAR, get ExceptionInInitializerError: version.properties not found执行 JAR 时,得到 ExceptionInInitializerError: version.properties not found
【发布时间】:2011-11-28 08:31:49
【问题描述】:

我一直在用 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);

【问题讨论】:

  • WAAAGH 是你的课程之一吗?
  • 是的,它是包含 main 方法的类。在第 52 行,我尝试启动 qt jambi
  • 你有没有检查过那些 qt-jambi jars 中有 version.properties 文件?
  • version.properties 文件在哪里?它是捆绑在罐子里的吗?

标签: java eclipse jar derby qt-jambi


【解决方案1】:

QtJambiObject 是如何加载的?您是否已将其打包在您的prova.jar 中?丢失的文件version.properties 应该是顶层同一个 jar 的一部分(不在任何子目录中)。看来您还没有将它打包在顶层的 prova.jar 中。请参阅this 了解如何加载它。

你最好在命令行中指定所有的 jars 和主类:

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

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

【讨论】:

    【解决方案2】:

    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 天内这样做)。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多