Eclipse-PDE: забавное поведение IDE при расширении AbstractDecoratedTextEditor

Я программирую плагины Eclipse, используя Kepler SR2. Допустим, я создаю пустой плагин plugin1 и добавляю следующий фиктивный класс:

package com.example.plugin1;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;

public class MyEditor extends AbstractDecoratedTextEditor {

    public static void main(String[] args) {
        System.out.println(MyEditor.class);
    }
}

IDE не дает мне естественной подсказки по исправлению (добавить org.eclipse.ui.editors), я добавляю ее вручную в зависимости ("Необходимые подключаемые модули"). Затем начинают происходить забавные вещи. Класс по-прежнему помечен как имеющий ошибки, и появляется следующая загадочная ошибка:

Тип org.eclipse.jface.text.revisions.RevisionInformation не может быть разрешен. На него косвенно ссылаются необходимые файлы .class.

Я не уверен, что это значит, поэтому я пытаюсь добавить org.eclipse.jface.text к нужным плагинам. Тогда он компилируется без ошибок. Но когда я пытаюсь выполнить свой (по общему признанию глупый, но законный) класс из панели запуска Eclipse, и странное всплывающее окно из панели запуска: «Произошло исключение Java», и консоль выплевывает эту трассировку стека:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/ui/actions/WorkspaceModifyOperation
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Unknown Source)
    at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.eclipse.ui.actions.WorkspaceModifyOperation
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 6 more

Я также пытался загрузить класс во время выполнения, используя Class.forName (в другом классе)

public static void main(String[] args) throws ClassNotFoundException {
    System.out.println("trying...");
    Class c=Class.forName("com.example.plugin1.MyEditor");
    System.out.println("class=" + c);
}

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

\eclipse\plugins\org.eclipse.ui_3.105.0.v20130522-1122.jar
\eclipse\plugins\org.eclipse.swt_3.102.1.v20140206-1334.jar
\eclipse\plugins\org.eclipse.swt.win32.win32.x86_3.102.1.v20140206-1358.jar
\eclipse\plugins\org.eclipse.jface_3.9.1.v20130725-1141.jar
\eclipse\plugins\org.eclipse.core.commands_3.6.100.v20130515-1857.jar
\eclipse\plugins\org.eclipse.ui.workbench_3.105.2.v20140211-1711.jar
\eclipse\plugins\org.eclipse.e4.ui.workbench3_0.12.0.v20130515-1857.jar
\eclipse\plugins\org.eclipse.core.runtime_3.9.100.v20131218-1515.jar
\eclipse\plugins\javax.annotation_1.1.0.v201209060031.jar
\eclipse\plugins\javax.inject_1.0.0.v20091030.jar
\eclipse\plugins\org.eclipse.osgi_3.9.1.v20140110-1610.jar
\eclipse\plugins\org.eclipse.equinox.common_3.6.200.v20130402-1505.jar
\eclipse\plugins\org.eclipse.core.jobs_3.5.300.v20130429-1813.jar
\eclipse\plugins\org.eclipse.core.runtime.compatibility.registry_3.5.200.v20130514-1256\runtime_registry_compatibility.jar
\eclipse\plugins\org.eclipse.equinox.registry_3.5.301.v20130717-1549.jar
\eclipse\plugins\org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar
\eclipse\plugins\org.eclipse.core.contenttype_3.4.200.v20130326-1255.jar
\eclipse\plugins\org.eclipse.equinox.app_1.3.100.v20130327-1442.jar
\eclipse\plugins\org.eclipse.ui.editors_3.8.100.v20130513-1637.jar
\eclipse\plugins\org.eclipse.core.filebuffers_3.5.300.v20130225-1821.jar
\eclipse\plugins\org.eclipse.jface.text_3.8.101.v20130802-1147.jar
\eclipse\plugins\org.eclipse.text_3.5.300.v20130515-1451.jar
\eclipse\plugins\org.eclipse.ui.ide_3.9.2.v20131004-0923.jar
\eclipse\plugins\org.eclipse.ui.views_3.6.100.v20130326-1250.jar
\eclipse\plugins\org.eclipse.ui.workbench.texteditor_3.8.101.v20130729-1318.jar

Я не могу понять это. Почему я не могу загрузить класс? Есть идеи?


person leonbloy    schedule 25.05.2014    source источник
comment
Вы не можете запускать подключаемые модули Eclipse из своего собственного main таким образом, вы должны использовать Run As > Eclipse Application, чтобы использовался правильный метод Eclipse main. Eclipse имеет много инициализаций, которые необходимо выполнить, чтобы система плагинов функционировала правильно.   -  person greg-449    schedule 25.05.2014
comment
Я знаю, у меня уже работает Eclipse-RCP, но проблема здесь не в создании/запуске классов внутри среды OSGI, а просто в попытке выполнить простую загрузку классов извне, из какого-то инструментального приложения. Я думаю, что классы для плагина Eclipse должны быть пригодны для использования (возможно, частично, по крайней мере, загружаемыми) из вызывающего абонента без головы.   -  person leonbloy    schedule 25.05.2014


Ответы (1)


Ну, я исправил это, добавив еще несколько плагинов. Полный набор необходимых плагинов, помимо org.eclipse.ui.editors, выглядит следующим образом:

org.eclipse.jface.text
org.eclipse.ui
org.eclipse.core.resources
org.eclipse.core.filesystem

Это просто эмпирические данные. Интересно, почему мне пришлось добавлять их вручную, разве они не должны требовать зависимости от org.eclipse.ui.editors?...

person leonbloy    schedule 25.05.2014
comment
Некоторые зависимости плагинов могут быть помечены как re export и не будут добавлены к явным зависимостям других плагинов. - person greg-449; 25.05.2014