2

bnd ランチャーの実行に問題があります。実際の問題はgradleを使用したビルド中に発生しましたが、jarを直接呼び出しても機能しません。Launcher クラスは実際にその jar に存在し、main メソッドがあります。このエラーが発生した理由を知っている人はいますか?

$ java -cp cnf/cache/biz.aQute.launcher/biz.aQute.launcher-1.4.0.jar aQute.launcher.Launcher
Error: Could not find or load main class aQute.launcher.Launcher

jar の内容を読むと、本当に Launcher クラスがあることがわかります。

$ jar tvf cnf/cache/biz.aQute.launcher/biz.aQute.launcher-1.4.0.jar
  1490 Fri Sep 26 06:49:00 CEST 2014 META-INF/MANIFEST.MF
       ...
  1586 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$1.class
  2270 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$2.class
   794 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$3.class
  1133 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$4.class
  1100 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$5.class
  1260 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$AllPermissionCollection.class
  1149 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher$AllPolicy.class
 37566 Fri Sep 26 06:49:00 CEST 2014 aQute/launcher/Launcher.class
       ...

また、別のランダム jar から別のランダム クラスをロードしようとしましたが、それは機能します。メイン メソッドが欠落している場合にのみ、別のエラーが発生します (メイン メソッドがクラスに見つかりません)。

また、これらすべてのファイルに対する権限は同じです。そうしないと、「jar tvf」も実行できませんでした。

それで、何かアイデアはありますか?

4

1 に答える 1

2

解決策を見つけました。依存関係が抜けていたようですが、OSGi フレームワークでした。クラスパスに felix フレームワークを追加したところ、起動しました。どうやら、Launcher クラスは OSGi フレームワークからのインターフェースを実装しており、このクラスが見つからない場合、クラスをまったくロードしません。これは、Java ランタイムの改善となる可能性があります (主に詳細な出力でこの問題が言及される可能性があります)。

ここで問題は、bnd がフレームワークなしでランチャーを起動しようとする理由ですが、これは私が彼らに尋ねたことです。

于 2014-12-15T08:09:55.403 に答える