Parche / Fusionar el archivo plugin.properties en el complemento mediante el uso de fragmentos

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

Pregunta

En mi plugin de.support.help están los archivos plugin.properties. Estos archivos de propiedades incluyen las cadenas para la página de preferencias.

Quiero usar este complemento para diferentes clientes, pero el nombre del cliente está dentro de los archivos de propiedades.

Quiero parchear los archivos de propiedades usando el mecanismo de fragmento de eclipse. Hasta ahora, el complemento de fragmentos puede parchear el complemento correspondiente en tiempo de ejecución.

Tengo el archivo plugin.properties en el complemento de.support.help que incluye la línea

plugin.name = Copyright XYZ

Y tengo el fragemt de.support.help.fragment que incluye el archivo plugin.properties con línea

plugin.name = Copyright ABC

Espero que en tiempo de ejecución la cadena " Copyright ABC " se muestra, pero no lo es. Había probado lo mismo con las clases de Java hace mucho tiempo y recuerdo que estaba funcionando. El código Java del fragmento se colocó en el complemento original.

¿Tienes alguna idea para manejar esto? ¿O entiendo mal el mecanismo de fragmentos?

Gracias

EDIT:

Cuando elimino el archivo plugin.properties del complemento de.support.help, funciona como se esperaba. El archivo de fragmento se copia en el directorio de complementos y se utiliza en tiempo de ejecución.

O tengo que parchear la clase de eclipse somce Can_fragments_be_used_to_patch_a_plug

¿Fue útil?

Solución 2

La solución que he implementado es como

Primero busque el archivo de propiedad de fragmento especial y luego busque el archivo de propiedad predeterminado.

El código es (Se cambiaron los nombres de los paquetes)

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

Otros consejos

Según Cómo internacionalizar su complemento Eclipse artículo

  

Un fragmento de complemento proporciona una funcionalidad adicional a su complemento de destino.
  En tiempo de ejecución, estas contribuciones de complementos se combinan con todos los fragmentos dependientes.

     

Estas contribuciones pueden incluir contribuciones de código y contribuciones de recursos asociados con un complemento, como propiedades y archivos HTML.

     

En otras palabras, el complemento tiene acceso a los contenidos del fragmento a través del cargador de clases del complemento.

     

La plataforma Eclipse combina fragmentos de plug-in de manera que los elementos de tiempo de ejecución en el fragmento aumenten el plug-in original.   El complemento de destino no se mueve, elimina o modifica de ninguna manera.

     

Dado que los recursos del fragmento están ubicados por el cargador de clases, el desarrollador del complemento no necesita saber si los recursos se cargan desde el archivo JAR del complemento o uno de los archivos JAR de sus fragmentos.


Sospecho que el cargador de clases detecta plugin.name en el de.support.help primero antes del de.support.help.fragment fragmento.

En este punto, no estoy seguro de que se pueda hacer, ya que se ha intentado antes (para Complemento Eclipse CheckStyle ), sin mucho éxito.

No puede reemplazar el contenido de un archivo con un fragmento, solo agregue archivos adicionales. Esto es cierto tanto para clases, archivos de propiedades, imágenes, ...

Existen varios métodos estándar para resolver este problema:

  • puede agregar un punto de extensión con esta y otra información específica del cliente.
  • primero puede buscar un archivo especial y este retrocede al general, como lo hizo Markus.
  • puede tener una dependencia opcional en un complemento con la información relevante.

Prefiero la última solución ya que esto también permite elegir entre algoritmos alternativos y otras cosas que no pertenecen a los archivos .properties ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top