フラグメントを使用したプラグインのplugin.propertiesファイルのパッチ/マージ

StackOverflow https://stackoverflow.com/questions/657756

質問

私のプラグイン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 + '!';
        }
    }
}

他のヒント

Eclipseプラグインを国際化する方法 の記事

  

プラグインフラグメントは、ターゲットプラグインに追加機能を提供します。
  実行時に、これらのプラグインのコントリビューションは、すべての依存フラグメントとともにマージされます。

     

これらのコントリビューションには、コードコントリビューションと、プロパティやHTMLファイルなど、プラグインに関連付けられたリソースのコントリビューションを含めることができます。

     

つまり、プラグインは、プラグインのクラスローダーを介してフラグメントのコンテンツにアクセスできます。

     

Eclipseプラットフォームは、フラグメント内のランタイム要素が元のターゲットプラグインを増強する方法でプラグインフラグメントをマージします。
  ターゲットプラグインは、いかなる方法でも移動、削除、または変更されません。

     

フラグメントのリソースはクラスローダーによって検出されるため、プラグイン開発者はリソースがプラグインのJARファイルからロードされるか、フラグメントのJARファイルからロードされるかを知る必要はありません。


classLoaderは、plugin.nameフラグメントの前に、最初にde.support.helpプラグインでde.support.help.fragmentを検出すると思われます。

Eclipse CheckStyleプラグイン)、あまり成功していません。

ファイルのコンテンツをフラグメントで置き換えることはできません-追加のファイルのみを追加してください。これは、クラス、プロパティファイル、画像などの両方に当てはまります...

この問題を解決するには、いくつかの標準的な方法があります:

  • この点やその他の顧客固有の情報を含む拡張ポイントを追加できます。
  • 最初に特別なファイルを探すことができ、これは一般的なファイルにフォールバックします-Markusによって行われます。
  • 関連情報を使用して、プラグインにオプションの依存関係を設定できます。

これは、代替のアルゴリズムと.propertiesファイルに属さないその他のアルゴリズムのどちらかを選択できるようにするため、最後のソリューションを好む...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top