Question

Dans mon plugin de.support.help se trouvent les fichiers plugin.properties. Ces fichiers de propriétés incluent les chaînes de la page de préférences.

Je souhaite utiliser ce plug-in pour différents clients, mais le nom du client se trouve dans les fichiers de propriétés.

Je souhaite corriger les fichiers de propriétés en utilisant le mécanisme de fragment eclipse. Pour le moment, le plugin fragment peut corriger le plugin correspondant lors de l'exécution.

J'ai le fichier plugin.properties dans le plugin de.support.help qui inclut la ligne

plugin.name = Copyright XYZ

Et j'ai le fragment de.support.help.fragment qui inclut le fichier plugin.properties avec la ligne

plugin.name = Copyright ABC

J'attends qu'au moment de l'exécution la chaîne "Copyright ABC" est montré, mais ce n'est pas. J'avais testé la même chose avec les classes de Java il y a longtemps et je me souviens que ça fonctionnait. Le code Java du fragment a été placé dans le plug-in d'origine.

Avez-vous une idée pour gérer cela? Ou est-ce que je comprends mal le mécanisme des fragments?

Merci

EDIT:

Lorsque je supprime le fichier plugin.properties du plugin de.support.help, il fonctionne comme prévu. Le fichier fragment est copié dans le répertoire du plugin et est utilisé lors de l'exécution.

Ou dois-je patcher la classe somce eclipse Can_fragments_be_used_to_patch_a

Était-ce utile?

La solution 2

La solution que j'ai mise en place est comme

Commencez par rechercher le fichier de propriétés de fragment spécial, puis le fichier de propriétés par défaut.

Le code est (les noms des ensembles ont été modifiés)

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 + '!';
        }
    }
}

Autres conseils

Selon Comment internationaliser votre plug-in Eclipse article

  

Un fragment de plug-in fournit des fonctionnalités supplémentaires à son plug-in cible.
  Au moment de l'exécution, ces contributions de plug-in sont fusionnées avec tous les fragments dépendants.

     

Ces contributions peuvent inclure des contributions de code et des ressources associées à un plug-in, telles que des fichiers de propriétés et HTML.

     

En d'autres termes, le plug-in a accès au contenu du fragment via le chargeur de classes du plug-in.

     

La plate-forme Eclipse fusionne les fragments de plug-in de manière à ce que les éléments d'exécution du fragment complètent le plug-in ciblé d'origine.
  Le plug-in cible n'est ni déplacé, ni supprimé, ni modifié.

     

Les ressources du fragment étant localisées par le chargeur de classes, le développeur du plug-in n'a pas besoin de savoir si des ressources sont chargées à partir du fichier JAR du plug-in ou de l'un des fichiers JAR de ses fragments.

Je pense que le classLoader a détecté plugin.name dans le plug-in de.support.help avant le de.support.help.fragment fragment.

À ce stade, je ne suis pas sûr que cela puisse être fait, car cela a déjà été tenté (pour le plugin Eclipse CheckStyle ), sans grand succès.

Vous ne pouvez pas remplacer le contenu d'un fichier par un fragment - ajoutez uniquement des fichiers supplémentaires. Ceci est vrai à la fois pour les classes, les fichiers de propriétés, les images, ...

Il existe plusieurs méthodes standard pour résoudre ce problème:

  • vous pouvez ajouter un point d’extension avec cette information et d’autres informations spécifiques au client.
  • vous pouvez d’abord rechercher un fichier spécial et revenir au fichier général - comme le fait Markus.
  • vous pouvez avoir une dépendance optionnelle sur un plugin avec les informations pertinentes.

Je préfère la dernière solution car elle permet également de choisir entre des algorithmes alternatifs et d’autres choses qui n’appartiennent pas aux fichiers .properties ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top