Kepler SR2를 사용하여 Eclipse 플러그인을 프로그래밍하고 있습니다.Eclipse-PDE : AbstractDecoratedTextEditor를 확장 할 때 재미있는 IDE 동작
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
추가)를 제공하지 않습니다, 나는 의존성 ("필수 플러그인에 수동으로 추가 : 이제 나는 다음과 같은 더미 클래스를 빈 플러그인 plugin1
를 생성하고 추가한다고 가정 해 봅시다 -ins "). 그러면 재미있는 일이 일어나기 시작합니다. 여전히 오류를 가지고, 다음과 같은 비밀 오류로 표시되어 클래스가 나타납니다
이 유형의 org.eclipse.jface.text.revisions.RevisionInformation이 이
를 확인할 수 없습니다. 필수 .class 파일에서 간접적으로 참조됩니다.
이것이 의미하는 것이 확실하지 않아 필요한 플러그인에 org.eclipse.jface.text
을 추가하려고합니다. 그런 다음 오류없이 컴파일됩니다. 그러나 나는 이클립스 실행에서 내 (admitedly 바보지만, 법적) 클래스를 실행하려고하고 실행기에서 이상한 팝업 때 "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\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
. 왜 클래스를로드 할 수 없습니까? 어떤 생각?
이처럼 자신의'main'에서 Eclipse 플러그인을 실행할 수 없으므로'Run As> Eclipse를 사용해야합니다 Application'을 사용하여 올바른 Eclipse의 main 메소드가 사용되도록합니다. 이클립스는 플러그인 시스템이 올바르게 작동하도록하기 위해 많은 초기화 작업을해야한다. –
필자는 이미 Eclipse-RCP를 사용하고 있지만이 문제는 OSGI 환경에서 클래스를 인스턴스화하거나 실행하는 것이 아니라 일부 툴링 응용 프로그램에서 외부에서 간단한 클래스 로딩을 시도하는 것으로 나타났습니다. 이클립스 플러그인의 클래스는 헤드리스 (headless) 호출자로부터 사용할 수 있어야한다 (아마 적어도 부분적으로로드 가능해야한다). – leonbloy