フラグメントを使用したプラグインのplugin.propertiesファイルのパッチ/マージ
質問
私のプラグインde.support.helpにはplugin.propertiesファイルがあります。 これらのプロパティファイルには、設定ページの文字列が含まれています。
このプラグインをさまざまな顧客に使用したいのですが、顧客名はプロパティファイル内にあります。
Eclipseフラグメントメカニズムを使用して、プロパティファイルにパッチを適用したい。現在のところ、フラグメントプラグインは、実行時に対応するプラグインにパッチを適用できます。
次の行を含むplugin de.support.helpにplugin.propertiesファイルがあります
plugin.name = Copyright XYZ
そして、ファイルplugin.propertiesと行を含むfragemt de.support.help.fragmentがあります
plugin.name = Copyright ABC
実行時に文字列<!> quot; Copyright ABC <!> quot;表示されますが、表示されません。私はずっと前にJavaクラスで同じことをテストしていましたが、彼が働いていたことを覚えています。フラグメントのJavaコードは元のプラグインに配置されました。
これを処理するアイデアはありますか?または、フラグメントメカニズムを誤解していますか?
ありがとう
編集:
de.support.helpプラグインからplugin.propertiesファイルを削除すると、期待どおりに機能します。フラグメントファイルはプラグインディレクトリにコピーされ、実行時に使用されます。
または、Somce Eclipseクラス Can_fragments_be_used_to_patch_a_plug
にパッチを適用する必要がありますか解決 2
実装したソリューションは次のようなものです
最初に特別なフラグメントプロパティファイルを探し、デフォルトのプロパティファイルを探します。
コードは(バンドル名が変更されました)
public final class FrameworkMessages {
private static final String BUNDLE_NAME = "de.rts.messages"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private static final String BUNDLE_FRAGMENT_NAME = "de.rts.fragment"; //$NON-NLS-1$
private FrameworkMessages() {
}
public static String getString(String key) {
try {
return ResourceBundle.getBundle(BUNDLE_FRAGMENT_NAME).getString(key);
} catch (MissingResourceException e) {
// Use messages in this plugin when no external fragment files can found
}
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
public static String getString(String pKey, Object[] pArgument) {
try {
return MessageFormat.format(RESOURCE_BUNDLE.getString(pKey), pArgument);
} catch (MissingResourceException e) {
return '!' + pKey + '!';
}
}
}
他のヒント
プラグインフラグメントは、ターゲットプラグインに追加機能を提供します。
実行時に、これらのプラグインのコントリビューションは、すべての依存フラグメントとともにマージされます。これらのコントリビューションには、コードコントリビューションと、プロパティやHTMLファイルなど、プラグインに関連付けられたリソースのコントリビューションを含めることができます。
つまり、プラグインは、プラグインのクラスローダーを介してフラグメントのコンテンツにアクセスできます。
Eclipseプラットフォームは、フラグメント内のランタイム要素が元のターゲットプラグインを増強する方法でプラグインフラグメントをマージします。
ターゲットプラグインは、いかなる方法でも移動、削除、または変更されません。フラグメントのリソースはクラスローダーによって検出されるため、プラグイン開発者はリソースがプラグインのJARファイルからロードされるか、フラグメントのJARファイルからロードされるかを知る必要はありません。
classLoaderは、plugin.name
フラグメントの前に、最初にde.support.help
プラグインでde.support.help.fragment
を検出すると思われます。
( Eclipse CheckStyleプラグイン)、あまり成功していません。
ファイルのコンテンツをフラグメントで置き換えることはできません-追加のファイルのみを追加してください。これは、クラス、プロパティファイル、画像などの両方に当てはまります...
この問題を解決するには、いくつかの標準的な方法があります:
- この点やその他の顧客固有の情報を含む拡張ポイントを追加できます。
- 最初に特別なファイルを探すことができ、これは一般的なファイルにフォールバックします-Markusによって行われます。
- 関連情報を使用して、プラグインにオプションの依存関係を設定できます。
これは、代替のアルゴリズムと.propertiesファイルに属さないその他のアルゴリズムのどちらかを選択できるようにするため、最後のソリューションを好む...