Patch/Merge plugin.properties файл в плагине с использованием фрагмента
В моем плагине 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 из фрагмента был помещен в исходный плагин.
У вас есть идея справиться с этим? Или я неправильно понимаю механизм фрагментов?
Спасибо
РЕДАКТИРОВАТЬ:
Когда я удаляю файл plugin.properties из плагина de.support.help, он работает как положено. Файл фрагмента копируется в каталог плагинов и используется во время выполнения.
Или я должен пропатчить класс Somce Eclipse http://wiki.eclipse.org/FAQ_Can_fragments_be_used_to_patch_a_plug-in%3F
3 ответа
Решение, которое я реализовал, похоже на
Сначала найдите специальный файл свойств фрагмента, а затем найдите файл свойств по умолчанию.
Код (имена пакетов были изменены)
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 его фрагментов.
Я подозреваю, что classLoader обнаруживает plugin.name
в de.support.help
плагин первым перед de.support.help.fragment
фрагмент.
На данный момент, я не уверен, что это можно сделать, так как это было сделано ранее (для плагина Eclipse CheckStyle), но без особого успеха.
Вы не можете заменить содержимое файла на фрагмент - только добавить дополнительные файлы. Это верно как для классов, файлов свойств, изображений, ...
Существует несколько стандартных методов решения этой проблемы:
- Вы можете добавить точку расширения с этой и другой специфической для клиента информацией.
- сначала вы можете найти специальный файл, а затем вернуться к общему - как это сделал Маркус.
- Вы можете иметь необязательную зависимость от плагина с соответствующей информацией.
Я предпочитаю последнее решение, так как оно также позволяет выбирать между альтернативными алгоритмами и другими вещами, которые не принадлежат файлам.properties...