有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从Equinox/Eclipse中获取对象

我面临的问题是“普通”Java、Equinox以及两者之间的通信的结合。我读过其他相关问题(herehere、和there)以及其他网站,如this onethat one),但找不到满意的(或工作的!)解决方案

我有一套插件:P1、P2和P3。P1导出P2使用的一些类。P2还导出P3使用的其他类和接口。特别是,P2定义并导出接口MyInterface,其实现类MyInterfaceImpl实现MyInterface。P3是一个应用程序,因此包含一个类启动器,它实现了IAApplication,并定义了公共对象启动(IAApplicationContext)方法。一切都很好。当我从Eclipse中将启动器作为Eclipse应用程序运行时,它运行良好。发射器使用MyInterfaceMyInterfaceImplfine

现在,我使用以下(简单)代码以编程方式运行我的应用程序,根据各种帖子,这似乎是运行Equinox/Eclipse应用程序的一种“好”方式:

void callApplication() {
    final String[] args =
        new String[] {
            "-application",
            "Launcher",
            ... };
    EclipseStarter.run(args, null);
}

同样,这段代码运行良好,我可以“看到”我的应用程序运行并产生预期的结果

现在,我的问题来了:我想获得一个由我的应用程序构建的MyInterfaceImpl实例,运行在Equinox中,回到“外部”Java代码中。我天真的解决方案是在public object start(iaapplicationcontext)方法中返回这个对象,并修改我的调用代码,如下所示:

MyInterface callApplication() {
    final String[] args =
        new String[] {
            "-application",
            "Launcher",
            ... };
    return (MyInterface) EclipseStarter.run(args, null);
}

但这种幼稚的解决方案行不通。我收到一个java。lang.ClassCastException:MyInterfaceImpl无法转换为MyInterface。考虑到这一点,这是有意义的,因为在callApplication()的末尾,我有两个{MyInterfaceMyInterfaceImpl}对的“版本”:一个来自“外部”Java代码,由JVM类加载器加载,另一个来自Equinox,由Equinox类加载器加载。我修改了代码,以打印返回对象和MyInterface的类加载器:

final Object o = EclipseStarter.run(args, null);
System.out.println(o.getClass().getClassLoader());
System.out.println(MyInterface.class.getClassLoader());

事实上,我得到了:

org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@7e66458c[P2:1.5.0(id=413)]
sun.misc.Launcher$AppClassLoader@1efc3d2

请注意,返回对象的类加载器被称为来自P2,正如预期的那样,因为P2是定义和导出MyInterfaceMyInterfaceImpl的插件

我尝试了不同的方法来获得{MyInterfaceMyInterfaceImpl}的“兼容”对,但迄今为止运气不佳(我总是得到相同的java.lang.ClassCastException:MyInterfaceImpl无法转换到MyInterface):

  • 我试着设置属性——多格。奥斯基。框架bootdelegation=*-Dorg。奥斯基。框架系统包装。extra=MyInterface,MyInterfaceImpl

  • 我还尝试在start()方法中拦截DefaultClassLoader

所以,我的问题是:一个Java程序,它使用项目中定义的一些类,它也是一个插件,并导出这些类,有没有一种方法可以将这些类的实例与以编程方式启动的Eclipse实例交换<谢谢


共 (0) 个答案