3

IDE内で完全に実行されるEclipseで小さなプロジェクトを書いています。次に、Eclipse を介して実行可能な .jar ファイルを作成しました (これには、jar 自体の内部にすべての依存関係ライブラリが含まれている必要があります)。

プロジェクトで 3 つのライブラリを使用します。

  • ダービー.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);
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

ちなみに、version.properties の場所は最近、バンドル com/trolltech/qt/version.properties のパッケージ名前空間内になるように変更されました。古い場所は設計上の選択が不十分であり、現在は修正されています。問題は、クラスパスに別の JAR があり、トップレベル ファイルもある場合、ClassLoader は、そのファイルを含む JAR がパッケージに対して信頼できるものであると見なす権利があり、別の JAR でファイルを検索する必要がないことです。パッケージは、Java でデプロイ可能な最小単位です。専門の ClassLoader (OSGi で使用されるものなど) のみが、Java 設計のこの部分を回避する機能を備えています。

通常、トップレベル (アプリケーション JAR) がリストの最初に表示されます。その JAR には /log4j.properties /commons-logging.properties などのファイルが 1 つ以上あるはずです。1 つ以上のファイルが存在するためです。 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/pipermail/qt-jambi-interest/のメーリングリストへの参加を検討してください。 .

于 2011-09-30T17:45:37.147 に答える