0

動作中のJavaプロジェクトをNetbeans6.9.1からNetbeans7.2移行しようとしましたが、プロジェクトの依存関係の1つがJNIを使​​用する外部JARであるため、問題が発生しています。

プロジェクトディレクトリのコピーを作成し、元々古いバージョンのIDEで作成されたNBプロジェクトのコピーを開くだけでした。すべてが順調に進みました。プロジェクトをビルドし、コンパイルされた実行可能JARをNetbeansの外部で問題なく実行できます。

ただし、プロジェクトをデバッグしようとすると、JNIとの依存関係JARが原因で、アプリケーションが正しく初期化できません。これは、JARがそれに関連付けられたDLLを見つけられないようです(java.lang.UnsatisfiedLinkError結果として私に与えられます)。これは6.9.1では発生しません!

なぜこれが起こっているのでしょうか?java.library.pathNB7 +で明示的に設定する必要がありますか?

プロジェクトに変更は加えられておらず(私たちによるものではありません)、同じJDKが両方のバージョンのIDEで使用されています。新しいバージョンは、プロジェクトセットアップに変更をサイレントに適用し、プロセスで何かを壊しているのではないかと思います。誰かが似たようなことを経験しましたか?

編集1:

をいじってみました、VM引数project.propertiesの設定-Djava.library.path、さまざまなJDK / JRE、...すべて無駄に。これは私を狂わせています。明らかに、私は何か間違ったことをしています。

4

1 に答える 1

0

私は何が悪かったのか理解しました。これは、外部JARのソース(ext.jar今後)をNetbeansプロジェクトの形式で取得して、デバッグできるようにした後で初めて明らかになりました。

ext.jar特定の条件に応じて、いくつかのDLLの1つをロードする場合があります。を使用して適切なDLLへのファイルパスを作成し、その値を使用してSomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()呼び出しSystem.load(path)ます。このパスは、Netbeansの2つのバージョン間で異なります。ext.jarは実際には別のJAR(Netbeansプロジェクトでもあります)によって使用されており、そのJARはアプリケーション(プロジェクトでもあります)のメインの実行可能JARによって使用されます。

Main JAR (Netbeans project)
 ˪ Common JAR (Netbeans project)
     ˪ External JAR with JNI (ext.jar)

プロジェクト設定のすべての外部ライブラリは、すべてのプロジェクトが存在するのと同じレベルのディレクトリ内に配置されます。これにより、複数のプロジェクトで共通のライブラリセットを使用できるようになります。プロジェクトは、相対パスを使用してライブラリを参照します。

CommonLibraries
MainJARProjdir
CommonJARProjdir
RandomProjdir1
…
RandomProjdirN

ビルドするときMainは、Commonその前にビルドする必要があります(Commonのプロジェクト依存ですMain)。Common(デフォルトで)ビルドの過程で、すべての依存関係JARがにコピーされ${common.proj.dir}/dist/libます。もちろん、コピープロセスは、DLLをと一緒にコピーする必要があるという事実を認識していませんext.jar

ただし、問題の根本は、6.9.17+での依存関係の処理の違いです。との両方への依存関係を指定した場合(コードを直接使用していなくても、これが実行されました)6.9.1は、デバッグ時に使用します。これには、必要なすべてのDLLが常に横にあります。 +は常にを使用しますが、DLLがありません。ext.jarMainCommonMain../CommonLibraries/ext.jar${common.proj.dir}/dist/lib/ext.jar

問題が何であるかを認識した後、解決策は簡単になります。-post-cleanのターゲットを追加しました。これbuild.xmlは、クリーンアップするたびに必要なDLLをからにCommonコピーするだけです。機能した。完全を期すために、これはどちらの方法でも実行する必要があります。../CommonLibraries/${common.proj.dir}/dist/lib/

2つのバージョンのIDEで依存関係の処理が異なる理由は、「依存関係ライブラリのコピー」Project Properties/Build/Packagingと呼ばれる新しいチェックボックスにあるようです。それをチェックすることもできます。このチェックボックスはデフォルトで有効になっていることに注意してください(ライブラリプロジェクトの場合でも)。Common

于 2012-10-18T11:13:35.200 に答える