Domanda

Nel mio plugin de.support.help ci sono i file plugin.properties. Questi file delle proprietà includono le stringhe per la pagina delle preferenze.

Voglio usare questo plugin per diversi clienti, ma il nome del cliente è all'interno dei file delle proprietà.

Voglio patchare i file delle proprietà usando il meccanismo del frammento di eclissi. Fino ad ora il plug-in frammento può rattoppare il plug-in corrispondente in fase di esecuzione.

Ho il file plugin.properties nel plugin de.support.help che include la linea

plugin.name = Copyright XYZ

E ho il fragemt de.support.help.fragment che include il file plugin.properties con la linea

plugin.name = Copyright ABC

Mi aspetto che in fase di esecuzione la stringa "Copyright ABC" viene mostrato, ma non lo è. Avevo provato lo stesso con le lezioni di Java molto tempo fa e ricordo che stava funzionando. Il codice java dal frammento è stato inserito nel plugin originale.

Hai idea di gestirlo? O fraintendo il meccanismo dei frammenti?

Grazie

Modifica

Quando rimuovo il file plugin.properties dal plugin de.support.help funziona come previsto. Il file di frammenti viene copiato nella directory del plugin e viene utilizzato in fase di esecuzione.

O devo patchare la classe eclipse somce Can_fragments_be_used_to_patch_a_plug

È stato utile?

Soluzione 2

La soluzione che ho implementato è come

Prima cerca il file di proprietà del frammento speciale e poi cerca il file di proprietà predefinito.

Il codice è (i nomi dei pacchetti sono stati cambiati)

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

Altri suggerimenti

Secondo Come internazionalizzare il plug-in Eclipse articolo

  

Un frammento di plug-in fornisce funzionalità aggiuntive al plug-in di destinazione.
  In fase di esecuzione, questi contributi plug-in vengono uniti a tutti i frammenti dipendenti.

     

Questi contributi possono includere contributi in codice e contributi di risorse associate a un plug-in, come proprietà e file HTML.

     

In altre parole, il plug-in ha accesso al contenuto del frammento tramite il classloader del plug-in.

     

La piattaforma Eclipse unisce i frammenti di plug-in in modo che gli elementi di runtime nel frammento aumentino il plug-in di destinazione originale.
  Il plug-in di destinazione non viene spostato, rimosso o modificato in alcun modo.

     

Poiché le risorse del frammento sono localizzate dal classloader, lo sviluppatore del plug-in non ha bisogno di sapere se le risorse sono caricate dal file JAR del plug-in o da uno dei file JAR dei suoi frammenti.


Sospetto che classLoader rilevi plugin.name nel plug-in de.support.help prima del de.support.help.fragment frammento.

A questo punto, non sono sicuro che possa essere fatto, dal momento che è stato tentato prima (per plugin Eclipse CheckStyle ), senza molto successo.

Non è possibile sostituire il contenuto di un file con un frammento: aggiungere solo file aggiuntivi. Questo vale sia per classi, file di proprietà, immagini, ...

Esistono diversi metodi standard per risolvere questo problema:

  • puoi aggiungere un punto di estensione con questa e altre informazioni specifiche del cliente.
  • puoi prima cercare un file speciale e questo torna a quello generale - come fatto da Markus.
  • puoi avere una dipendenza opzionale da un plugin con le informazioni rilevanti.

Preferisco l'ultima soluzione in quanto ciò consente anche di scegliere tra algoritmi alternativi e altre cose che non appartengono ai file .properties ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top