Eclipse RCP で孤立したプラグインを見つけるにはどうすればよいですか?
-
05-07-2019 - |
質問
RCP を使用してサイトを更新すると、孤立したプラグインが禁止されます。それ以外の場合は、機能に含まれていないプラグインが禁止されます。この条件が満たされていない場合、アップデート マネージャーは次のエラーを返します。結果の構成にはプラットフォームは含まれません。
残念ながら、どのプラグインが孤立しているかを判断する方法はありません。孤立したプラグインを見つけるにはどうすればよいですか?
解決
ここが出発点です (これは Eclipse 3.4 以降に当てはまりますが、P2 リポジトリが導入されたとき、それ以前のバージョンでは設定の保存方法が異なります。IIRC では、platform.xml ですべてのプラグインと機能を確認できます)。
「Hello World」テンプレートを使用して新しいプラグイン プロジェクト ([新規]->[その他]->[プラグイン開発]->[プラグイン プロジェクト]) を作成し、このコードを SampleAction の run メソッドにドロップします。
プラグインをテスト Eclipse アプリケーションとして実行し、「サンプル メニュー」->「サンプル アクション」を選択すると、機能に属さないプラグインが親ワークスペースのコンソールに出力されます。これを実行すると、予想よりもかなり多くのエラーが発生しました。何度か確認しましたが、ロジック エラーを見つけることができませんでした。
編集すると、最も内側のループで使用されている間違った配列インデックスが使用されていたため、ロジック エラーが見つかりました。まだ完全には正しくありませんが。
編集2.(フェイスパームの瞬間) 問題が見つかりました。必ずターゲット ワークスペースを実行してください。 すべてのワークスペースと有効なターゲットプラグインが有効, そうでないと、明らかに結果が歪んでしまいます。プラグインをインストールして少しドレスアップすれば、この問題は発生しません。
//get all the plugins that belong to features
IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
Map<Long, IBundleGroup> bundlesMap = new HashMap<Long, IBundleGroup>();
if (providers != null) {
for (int i = 0; i < providers.length; i++) {
IBundleGroup[] bundleGroups = providers[i].getBundleGroups();
System.out.println("Bundle groups:");
for (int j = 0; j < bundleGroups.length; j++) {
Bundle[] bundles = bundleGroups[j] == null ? new Bundle[0] : bundleGroups[j]
.getBundles();
System.out.println(bundleGroups[j].getIdentifier());
for (int k = 0; k < bundles.length; k++) {
bundlesMap.put(bundles[k].getBundleId(), bundleGroups[j]);
}
}
}
}
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
if(bundleContext instanceof BundleContextImpl) {
Bundle[] bundles = ((BundleContextImpl)bundleContext).getBundles();
System.out.println("Orphan Bundles:");
for (int i = 0; i < bundles.length; i++) {
if(!bundlesMap.containsKey(bundles[i].getBundleId())) {
System.out.println(bundles[i].getSymbolicName());
}
}
}