Файл плагина Patch/Merge.properties в плагине с помощью фрагмента

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

Вопрос

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

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

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

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

plugin.name = Copyright XYZ

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

plugin.name = Copyright ABC

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

У тебя есть какая-нибудь идея, как с этим справиться?Или я неправильно понимаю механизм фрагментации?

Спасибо

Редактировать:

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

Или мне нужно исправить класс 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-файлов одного из его фрагментов.


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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top