java - 另一个插件中定义的类无法由主插件 Eclipse 产品找到

  显示原文与译文双语对照的内容

我将插件项目导出为产品,当运行产品( Eclipse 应用程序) 时,主插件( org.example.framework.core ) 无法在另一个插件( org.example.abc ) 中定义扩展。 类是扩展中定义的元素之一。 但是,当我在 Eclipse 中运行项目时,一切都 !

这里是日志( atvste.ppt.ptfwDescription.abc.decoderInfoorg.example.abc plugin 中的软件包):

0 [Worker-2] ERROR org.example.framework.core.ptfw.codec.decode.MsgDecoderInfo org.example.framework.core.ptfw.codec.decode.MsgDecoderInfo.createInstance(MsgDecoderInfo.java:114) : can not create class for :atvste.ppt.ptfwDescription.abc.decoderInfo.MsgDecoderInfoABC atvste.ppt.ptfwDescription.abc.decoderInfo.MsgDecoderInfoABC cannot be found by org.example.framework.core_1.0.0.201404111439 java.lang.ClassNotFoundException: atvste.ppt.ptfwDescription.abc.decoderInfo.MsgDecoderInfoABC cannot be found by org.example.framework.core_1.0.0.201404111439 at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at org.example.framework.core.ptfw.codec.decode.MsgDecoderInfo.createInstance(MsgDecoderInfo.java:104) at org.example.framework.core.ptfw.codec.decode.DecoderInfo.<init>(DecoderInfo.java:56) at org.example.framework.core.ptfw.codec.decode.DecoderInfo.createInstance(DecoderInfo.java:125) at org.example.framework.core.ptfw.codec.ptfwObjectsFactory.decoderInfoItf_createInstance(ptfwObjectsFactory.java:200) at org.example.framework.persistence.jaxb.ptfwDescriptionPersistenceJaxb.createptfwDescription(ptfwDescriptionPersistenceJaxb.java:326) at org.example.framework.persistence.jaxb.ptfwDescriptionPersistenceJaxb.fillptfwDescription(ptfwDescriptionPersistenceJaxb.java:247) at org.example.framework.persistence.jaxb.ptfwDescriptionPersistenceJaxb.createInstance(ptfwDescriptionPersistenceJaxb.java:232) at org.example.framework.persistence.jaxb.ptfwDescriptionPersistenceJaxb.open(ptfwDescriptionPersistenceJaxb.java:146) at org.example.framework.core.ptfw.codec.ptfwDescription.createInstance(ptfwDescription.java:152) at org.example.framework.core.ptfw.codec.command.CmdLoadptfwDescription.loadptfwDescription(CmdLoadptfwDescription.java:50) at org.example.framework.core.ptfw.codec.command.CmdLoadptfwDescription.execute(CmdLoadptfwDescription.java:40) at org.example.framework.core.runtime.JobService$2.run(JobService.java:93) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

:用于创建类实例的函数


 public static IMessageDecoderInfo createInstance(XmlgMsgDecoderInfo pMsgDecoderInfoType,
 IMessageDecoderInfo msgDecoder)
{

 String className = pMsgDecoderInfoType.getClassName();
 if(className!=null)
 {
 try
 {
 Class<?> formalArgs[] = new Class[1];
 formalArgs[0] = XmlgMsgDecoderInfo.class;
 Class<?> clazz;
 if (msgDecoder!= null)
 {
 clazz = msgDecoder.getClass();
 }
 else
 {
 clazz = Class.forName( className );
 }
 Constructor<?> constructor = clazz.getConstructor(formalArgs);
 java.lang.Object actualArgs[] =
 { pMsgDecoderInfoType };

 return (IMessageDecoderInfo)constructor.newInstance(actualArgs);
 }catch(Exception e) {
 String error ="can not create class for :" +className+"" + e.getMessage();
 if (LOGGER.isEnabledFor(Level.ERROR)) {
 LOGGER.error(error, e);
 }
 throw new CreatePtfwElementRuntimeException(error, e);
 }
 }
 return new MsgDecoderInfo(pMsgDecoderInfoType);
}`

时间: 原作者:

由于 Eclipse 使用了复杂的类加载器系统,所以不能使用 Class.forName 在另一个插件中加载类。

如果代码正在处理扩展点定义,则将为指定类名称的配置元素提供 IConfigurationElement 。 你可以使用


IConfigurationElement configElement =.. ..;

Object classInstance = configElement.createExecutableExtension("class attribute name");

其中'类属性名称'是扩展点元素中属性的名称,该元素指定要加载的类。 正在创建的类必须具有无参数构造函数。

或者,可以使用以下方法加载类:


Bundle bundle = Platform.getBundle("plugin id");

Class<?> theClass = bundle.loadClass("class name");

... construct as usual.. .

如果你有 IConfigurationElement,你可以使用插件 id


String pluginId = configElement.getContributor().getName();

原作者:
...