Patch / Merge plugin.properties файл в плагине с использованием фрагмента - PullRequest
2 голосов
/ 18 марта 2009

В моем плагине de.support.help находятся файлы plugin.properties. Эти файлы свойств содержат строки для страницы настроек.

Я хочу использовать этот плагин для разных клиентов, но имя клиента находится внутри файлов свойств.

Я хочу пропатчить файлы свойств с помощью механизма фрагмента затмения. Насколько я сейчас, плагин фрагмента может исправлять плагин coresponding во время выполнения.

У меня есть файл plugin.properties в плагине de.support.help, который включает в себя строку

plugin.name = Copyright XYZ

И у меня есть fragemt de.support.help.fragment, который включает в себя файл plugin.properties со строкой

plugin.name = Copyright ABC

Я ожидаю, что во время выполнения будет показана строка «Copyright ABC», но это не так. Я тестировал то же самое на уроках Java, и я помню, что он работал. Код Java из фрагмента был помещен в исходный плагин.

Есть ли у вас идеи справиться с этим? Или я неправильно понимаю механизм фрагментов?

Спасибо

EDIT:

Когда я удаляю файл plugin.properties из плагина de.support.help, он работает как положено. Файл фрагмента копируется в каталог плагина и используется во время выполнения.

Или я должен пропатчить класс Somce Eclipse Can_fragments_be_used_to_patch_a_plug

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Решение, которое я реализовал, похоже на

Сначала найдите файл свойств специального фрагмента, а затем найдите файл свойств по умолчанию.

Код (имена пакетов были изменены)

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 + '!';
        }
    }
}
1 голос
/ 28 июня 2011

Вы не можете заменить содержимое файла на фрагмент - только добавить дополнительные файлы. Это верно как для классов, файлов свойств, изображений, ...

Существует несколько стандартных методов решения этой проблемы:

  • Вы можете добавить точку расширения с этой и другой специфической для клиента информацией.
  • Вы можете сначала найти специальный файл, а затем вернуться к общему - как это сделал Маркус.
  • вы можете иметь необязательную зависимость от плагина с соответствующей информацией.

Я предпочитаю последнее решение, поскольку оно также позволяет выбирать между альтернативными алгоритмами и другими вещами, которые не принадлежат файлам .properties ...

1 голос
/ 18 марта 2009

Согласно Как интернационализировать свой плагин Eclipse статья

Фрагмент плагина предоставляет дополнительные функции своему целевому плагину.
Во время выполнения эти вкладки подключаемого модуля объединяются со всеми зависимыми фрагментами.

Эти вклады могут включать вклады кода и вклады ресурсов, связанных с плагином, например, свойства и файлы HTML.

Другими словами, плагин имеет доступ к содержимому фрагмента через загрузчик классов плагина.

Платформа Eclipse объединяет фрагменты подключаемого модуля таким образом, что элементы времени выполнения во фрагменте дополняют исходный целевой подключаемый модуль.
Целевой плагин не перемещается, не удаляется и не изменяется каким-либо образом.

Поскольку ресурсы фрагмента находятся в загрузчике классов, разработчику плагина не нужно знать, загружаются ли ресурсы из файла JAR плагина или одного из файлов JAR его фрагментов.


Я подозреваю, что classLoader сначала обнаружит plugin.name в плагине de.support.help перед фрагментом de.support.help.fragment.

На данный момент, я не уверен, что это можно сделать, так как это было сделано ранее (для плагина Eclipse CheckStyle ), без особого успеха.

...