Java 加载扩展点贡献中的类
我必须从我创建的扩展点检索一个类。我的目标是使用外部化的导出插件从我的UI插件导出一个文件Java 加载扩展点贡献中的类,java,eclipse,eclipse-plugin,eclipse-rcp,Java,Eclipse,Eclipse Plugin,Eclipse Rcp,我必须从我创建的扩展点检索一个类。我的目标是使用外部化的导出插件从我的UI插件导出一个文件 我的插件A(UI)只是使用B的导出类有一个服务 我的插件B(导出插件)有一个扩展点。它的一个属性是ExportClass,必需,并请求实现IExport类的类 我的插件C(以XML格式导出)对A的extensionPoint进行了扩展。一个类将IExport实现为ExportClass属性,名为ExportXML 我的服务类Export不会加载ExportXML类,我不知道为什么。我检查了依赖项、捆绑
- 我的插件A(UI)只是使用B的
类有一个服务导出
- 我的插件B(导出插件)有一个扩展点。它的一个属性是ExportClass,必需,并请求实现
类的类IExport
- 我的插件C(以XML格式导出)对A的extensionPoint进行了扩展。一个类将
实现为ExportClass属性,名为IExport
ExportXML
Export
不会加载ExportXML
类,我不知道为什么。我检查了依赖项、捆绑路径,并在build.properties文件中添加了我的org.jdom依赖项。但是,我仍然不知道,因为每次尝试启动导出时,加载类失败,并出现错误:
org.eclipse.core.runtime.CoreException:插件C无法加载类C.ExportXML
位于org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throweException(RegistryStrategyOSGI.java:194)
位于org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176)
[...]
原因:java.lang.ClassNotFoundException:C_1.0.0.0找不到C.ExportXML
位于org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:448)
位于org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:361)
我有点说不出话来,因为我找不到错误的来源。
我用于检索插件B中的ExportXML
类的函数是:
IExport exportClass = null;
for(IConfigurationElement contribution : this.getContributions()){
if(contribution.getAttribute(Export_ExtensionPoint_Attribute_formatExtension).equals(formatExtension)){
Object o;
try {
o = contribution.createExecutableExtension(Export_ExtensionPoint_Attribute_exportClass);
if(o instanceof IExport)
exportClass = (IExport) o;
} catch (CoreException e) {
e.printStackTrace();
}
}
}
以下是C plugin.xml:
注意:我可以在try中输入属性formatExtension,只是creatExecutableExtension方法失败了
build.properties文件:
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
icons/,\
lib/jdom-2.0.6.jar
MANIFEST.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: XML Export
Bundle-SymbolicName: fr.enseeiht.waldo.tools.export.xml;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: fr.enseeiht.waldo.tools.export.xml.Activator
Bundle-Vendor: Waldo
Require-Bundle: org.eclipse.core.runtime,
fr.enseeiht.waldo.tools.analyzer;bundle-version="2.0.0",
fr.enseeiht.waldo.tools.export;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
插件结构:
提前感谢您的帮助在MANIFEST.MF中没有
包类路径
,这是告诉Eclipse在哪里查找目标代码所必需的。应该是这样的:
Bundle-ClassPath: .,
lib/jdom-2.0.6.jar
在MANIFEST.MF编辑器中,您可以在“Classpath”部分的“Runtime”选项卡上进行设置。它正在plugin
C
中的C
包中寻找一个类ExportXML
-这个类真的在名为C
的包中吗?是的,它不好吗?它不是一个好名字,按照惯例,包名是小写的,但只要它是正确的,我想它是可以的。这就是错误信息的全部吗?我希望还有一个“由引起的”部分?哦,你的意思是如果“C”是插件和包的名称?不,不是,我只是修改了它来展示我的例子。但是我的文件在一个插件名为^^的包中,我刚刚在主题中添加了“原因”部分,谢谢哦,我的天啊,我刚刚发现“限定符”的名称有一个错误,我肯定把包的名称错放在了某个地方(有点像一个loooong的包名…),我要检查错误是否来自于此,但这当然是事实
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: XML Export
Bundle-SymbolicName: fr.enseeiht.waldo.tools.export.xml;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: fr.enseeiht.waldo.tools.export.xml.Activator
Bundle-Vendor: Waldo
Require-Bundle: org.eclipse.core.runtime,
fr.enseeiht.waldo.tools.analyzer;bundle-version="2.0.0",
fr.enseeiht.waldo.tools.export;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
lib/jdom-2.0.6.jar