1

これらのjar内の.classファイルを検索できるすべてのjarパスを取得したいと思います。App mainフォルダーの下にあるすべてのjarを検索する関数を作成しましたが、問題が発生しました。一部のjarバンドルは存在しますが、古く、OSGiでは使用されていません。xxxx_1.0.0.jarとxxxx_1.2.0.jarの両方が存在しますが、OSGiで使用されるのは1.2.0のみです。メインフォルダで検索すると、そのうちの1つが結果リストに表示されます。

では、OSGiで使用されているすべてのjarファイルを取得する方法はありますか?次に、使用されていないjarファイルを除外できます。ありがとう

追加: この方法を使用してすべてのバンドルの絶対URLを取得しようとしましたが、失敗しました:

StringBuffer sb = new StringBuffer();
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles();
for (Bundle bundle : bundles) {
    java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation();
    sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n");
}

しかし、次の出力が100回繰り返されました。

File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar, 
File:....

使用されているバンドルの数は588です。これは正しい可能性があり、APIから絶対バンドルパスを取得できますが、なぜそれらがすべて同じなのですか?どうすれば実際のパスを取得できますか?

4

2 に答える 2

3

BundleContext#getBundles()すべてのバンドルを提供します。次に、シンボリック名とバージョンを比較できます。ただし、xxxx_1.0.0.jarとxxxx_1.2.0.jarの両方があるからといって、xxx​​_1.0.0.jarが使用されていないことを意味するわけではありません。xxx_1.0.0.jarを必要とする他のバンドルが存在する可能性があります。同様に、バンドルが開始されていないからといって、後で開始されないという意味ではありません。OSGiリゾルバーを再実装する必要はありません。リポジトリをクリーンアップする場合は、p2のGCアプリケーションなど、リポジトリのベンダーが提供するアプリケーションを使用することをお勧めします。

于 2012-07-03T04:34:41.597 に答える
2

バンドルを考えてください...単にbundle.getResource(clazz.getName()。replace('。'、'/')+ "。class")を実行してください

再コンパイルする前に、バンドル「OSGI-OPT / src/」+clazz.getName()。replace('。'、'/')+ "。java"を調べてください。実際のソース・コードがそこにある可能性があります。

于 2012-07-03T17:30:11.703 に答える