2
ikvmcを使用してJavaライブラリを正常に変換しました。Javaライブラリは、自己jarファイル内のいくつかのリソースを使用します。このJavaライブラリのすべてのクラスにアクセスできますが、this.getClass()。getResource()を呼び出すメソッドを呼び出すと、アセンブリ内のこれらのリソースまたはアセンブリ内のjarファイルが検索されません。しかし、これらのリソースをアセンブリと同じフォルダーに配置すると、リソースを見つけることができます。しかし、それは毎回うまく機能するとは限りません。たとえば、Webサイトプロジェクト(mvc)でアセンブリを参照した場合、リソースが見つかりません。これらのリソースをbinフォルダー、ルートフォルダー、ビューのフォルダーなどに配置しようとしました(この投稿へのコメントを参照してください)

だから私は恒久的な解決策が必要です。Javaライブラリはオープンソースプロジェクトです。しかし、私はソースを変更したくありません。プロジェクトのコンパイルには、Eclipse、Ant、サードパーティのライブラリなどが必要なためです。また、Javaライブラリの次のリリースでは、コードを変更してコンパイルする必要があります。

ikvmcの「リソース」パラメータを見ました。しかし、このためのドキュメントや例は見つかりませんでした。

次に、getResourceメソッドを呼び出すjavaクラスから派生した.netクラスを実装してみます。次に、getResourceメソッドを呼び出すメソッドをオーバーライドします。しかし、これも恒久的な解決策ではありません。

4

1 に答える 1

3

私は解決策を見つけました。実際、私は間違っていた場所を見つけました。最初に、次のように Java ライブラリを変換しました。

    ikvmc first.jar -target:ライブラリ -out:main.library.dll
    ikvmc second.jar -target:ライブラリ -out:second.dll -r:main.library.dll
    ikvmc third.jar -target:ライブラリ -out:third.dll -r:main.library.dll

次に、これらすべての dll を ILMerge にマージしました。問題はdllのマージではありませんでした。問題はリソースのロードにありました。ローダー関数はメイン ライブラリにあります。そして、2 番目と 3 番目のライブラリは、メイン ライブラリのこのローダー関数を使用します。そのため、ローダー関数はその jar ファイルである first.jar のみを検索します。それらのすべてが同じマージされたdllにある場合でも、他のjarを検索しません。そこで、変換スクリプトを次のように変更しました。

    ikvmc first.jar -target:library -out:merged.library.dll -sharedclassloader { second.jar } { third.jar }

そのため、すべての jar がこの 1 行のコマンドでマージされました。もう ILMerge を使う必要はありませんが。ikvmc のヘルプ ページに「sharedclassloader」に関する説明がありません。この説明はこのページにあります。

于 2011-10-06T12:35:11.127 に答える