gpt4 book ai didi

java - 从 Equinox/Eclipse 获取对象

转载 作者:行者123 更新时间:2023-12-01 14:18:54 25 4
gpt4 key购买 nike

我面临的问题是“普通”Java、Equinox 以及两者之间的通信的组合。我已阅读其他相关问题( hereherethere 以及其他网站,例如 this onethat one ),但找不到令人满意的(或有效的!)解决方案。

我有一组插件:P1、P2 和 P3。 P1导出一些类,供P2使用。 P2还导出其他类和接口(interface),供P3使用。特别是,P2 定义并导出接口(interface) MyInterface 及其实现类 MyInterfaceImpl 实现 MyInterface。 P3 是一个应用程序,因此包含一个类 Launcher 实现 IApplication 并定义公共(public)对象 start(IApplicationContext) 方法。一切编译都很好。当我从 Eclipse 将 Launcher 作为 Eclipse 应用程序运行时,它运行良好。启动器使用 MyInterfaceMyInterfaceImpl 很好。

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

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

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

现在,我的问题来了:我想获取由我的应用程序构建的 MyInterfaceImpl 实例,该实例在 Equinox 中运行,回到“外部”Java 代码内部。我天真的解决方案是在 public Object start(IApplicationContext) 方法中返回此对象,并按如下方式修改我的调用代码:

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

但是这个简单的解决方案不起作用。我收到 java.lang.ClassCastException: MyInterfaceImpl 无法转换为 MyInterface。想想看,这是有道理的,因为在 callApplication() 的末尾,我有两个“版本”的 {MyInterface, MyInterfaceImpl 对>}:一个来自“外部”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 的插件>。

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

  • 我尝试设置属性 -Dorg.osgi.framework.bootdelegation=* -Dorg.osgi.framework.system.packages.extra=MyInterface,MyInterfaceImpl。

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

所以,我的问题是:有没有一种方法可以让 Java 程序使用项目中定义的一些类(该项目也是一个插件并导出这些类)来与以下对象交换这些类的实例:以编程方式启动 Eclipse 实例? 谢谢!

最佳答案

啊,这个有点棘手。我建议重新构建您的应用程序并使用插件来完成所有内容,但这并不能回答您的问题。

现在,您要做的是首先删除 P2 中的接口(interface)定义并将其添加到您的原始(非 OSGi)JAR 中,最好是单独放在一个包中,比如说 com.example.api 。然后,添加-Dorg.osgi.framework.system.packages.extra=com.example.api ;还为该包在 P2 和 P3 中添加导入。

希望这有帮助。

关于java - 从 Equinox/Eclipse 获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17823753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com