Фрагмент плагина Eclipse
Есть ли у кого-нибудь образец "привет мир" или учебник для создания фрагмента плагина Eclipse?
У меня есть рабочий хост-плагин, который для простоты - это просто...
public void start(BundleContext context) throws Exception {
System.out.println("Hello....");
super.start(context);
plugin = this;
}
public void stop(BundleContext context) throws Exception {
System.out.println("Goodbye...");
plugin = null;
super.stop(context);
}
Прост достаточно и работает. Теперь я хочу добавить фрагмент к этому хосту, который кажется не таким простым, как создание узла плагина. Я просто не вижу, как создать проект фрагмента и добавить к нему логику. Скажем, я просто хочу сделать что-то простое и иметь фрагмент для печати "Hello2" в start()
и "Goodbye2" в stop()
. Может ли кто-нибудь дать мне рабочий пример?
Ответы
Ответ 1
-
Eclipse → File → New... → Fragment project → установить плагин хоста (который находится либо в вашей рабочей области, либо в плагинах на целевой платформе).
-
Откройте редактор манифеста плагина (вы можете сделать это, нажав на build.properties
, manifest.mf
или fragment.xml
- если такого файла нет, создайте его вручную)
-
В вкладке Расширения нажмите Добавить.. и добавьте org.eclipse.ui.startup
и просмотрите класс, который реализует класс org.eclipse.ui.IStartup
.
-
Создайте этот класс и реализуйте его. Вам необходимо реализовать метод earlyStartup()
который является точкой входа в фрагмент.
Примечание. Строки ниже - это просто пример. Я не тестировал его, чтобы могли быть ошибки...
Все, что вам нужно, это (это структура проекта/структура каталогов):
- Фрагмент-проект - корневой каталог
- /META-INF
- /src (который является исходным каталогом)
- FragmentStartClass.java (которые реализуют интерфейс org.eclipse.ui.IStartup и метод earlyStartup)
- build.properties
- fragment.xml
Содержание META-INF/MANIFEST.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: FragmentProject
Bundle-SymbolicName: FragmentProject;singleton:=true
Bundle-Version: 1.0.0
Bundle-ClassPath: src/,.
Fragment-Host: *HostPluginProjectSymbolicName*;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle:
Содержимое build.properties:
source.. = src,\
output.. = bin/
bin.includes = META-INF/,
.,
fragment.xml
contents.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<fragment>
<extension
point="org.eclipse.ui.startup">
<startup
class="FragmentStartClass">
</startup>
</extension>
</fragment>
Содержимое FragmentStartClass.java:
import org.eclipse.ui.IStartup;
public class FragmentStartClass implements IStartup {
public void earlyStartup() {
System.out.println("Hello World From Fragment!");
}
}
Ответ 2
Хорошо, во-первых, чего вы пытаетесь достичь? Вы уверены, что фрагменты - это решение?
Фрагменты - это просто дополнения к существующему плагину. Активатор Bundle-Activator не запускает этот фрагмент. Вы просто получаете дополнительные ресурсы в фрагменте. Вы можете использовать точку расширения, чтобы сообщить хосту, что какая-то конкретная функциональность была расширена данным фрагментом. Подумайте об этом как о слиянии двух во время выполнения.
Смотрите это примечание из Eclipse Wiki.
Ответ 3
Я не уверен, что вы можете сделать это без плагина хоста, зная что-то о загрузке дополнительного кода реализации фрагмента.
Например:
MyInterface o = null;
try {
Class<?> c = getClass().getClassLoader().loadClass("my.fragment.Activator");
o = (MyInterface) c.newInstance();
} catch (ClassNotFoundException e) {
}
if (o != null) {
o.start();
}
где MyInterface - это интерфейс, определенный в плагине хоста, и реализованный вашим фрагментом.
Другой способ может заключаться в том, чтобы фрагмент предоставил точку расширения, идентифицирующую расширенный класс, но это, вероятно, больше, чем нужно.
Ответ 4
Я думаю, что то, что вы пытаетесь сделать, лучше обслуживается с помощью точек расширения и отдельных плагинов, так как вы хотите добавить функциональность в базовый плагин.
Фрагменты используются только для добавления ресурсов или дополнительных классов в базовый плагин.
Ответ 5
Для записи я просто создал фрагмент Eclipse, содержащий некоторые классы правил Java PMD.
Рядом с файлами класса в этом Jar есть только один файл: META-INF/MANIFEST.MF
:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.acme.tools.pmd
Bundle-SymbolicName: com.acme.tools.pmd;singleton:=true
Bundle-Version: 1.0.0
Fragment-Host: net.sourceforge.pmd.eclipse.plugin;bundle-version="3.2.6"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Я пробовал это с помощью текущего Eclipse 3.7. Развертывание осуществляется путем размещения файла Jar в <eclipse root>/dropins/plugins
(создайте эту папку, если она еще не существует).