当前位置: 首页 > 知识库问答 >
问题:

如何从Equinox框架(java)中获取服务返回的bundle对象。lang.LinkageError

糜鸿风
2023-03-14

我有一个运行Equinox框架的类。现在我想获取一个对象(在其中一个bundle中定义),该对象由框架外的服务返回。

不幸的是,我得到了一个LinkageError,不知道如何摆脱它。甚至可以让服务向非捆绑代码返回适当的对象吗?

以下是完整的故事:

ParserDTOBundle是一个包,它定义了类ParserDTO并导出了相应的包。

在另一个包ParserServiceBundle中,我定义了一个名为ParserService的服务。此捆绑包导入ParserDTO的包。ParserService的函数getDTO()创建一个新的ParserDTO对象并返回它。

现在,我创建了另一个类,该类启动Equinox框架并从目录加载这两个包:

...
EclipseStarter.setInitialProperties(frameworkPropertiesMap);
bundleContext = EclipseStarter.startup(new String[] { "-console", "-dev", "bin" }, null);

bundleContext.installBundle("file:/" + dir + "ParserDTOBundle-0.0.1-SNAPSHOT.jar");
Bundle service = bundleContext.installBundle("file:/" + dir + "ParserServiceBundle-0.0.1-SNAPSHOT.jar");
service.start();

ServiceReference serviceReference = bundleContext.getServiceReference(ParserService.class.getName());

if (serviceReference != null) {
     ParserService ps = (ParserService) bundleContext.getService(serviceReference);
     if (ps != null) {
          ParserDTO dto = ps.getDTO();
          System.out.println(dto.getValue());
     }
 }

上述类是非bundle Maven项目的一部分。上述类的运行失败,原因是:

Exception in thread "main" java.lang.LinkageError: loader constraint violation: loader (instance of sun/misc/Launcher$AppClassLoader) previously initiated loading for a different type with name "de/ParserDTO"

有趣的是,我在System.out.println得到这个错误,而不是之前的行。我的主类中ParserDTO类的类加载器明显不同于对象dto的类加载器。

如何获取存储在dto中的信息??这可能吗??我必须这样做吗将我的普通类装入器交给bundle或2。)请改用基本数据类型或3。)一些完全不同的方式??

提前谢谢大家!塞巴斯蒂安

共有1个答案

景温书
2023-03-14

因此类ParserDTO由两个不同的类装入器独立装入:包内的一个类装入器和“外部”应用程序中的应用程序类装入器。您需要确保它只由一个类加载器加载。

当两个普通bundle出现此问题时,关键是确保一个bundle导出包,另一个导入包(或者它们都从第三个bundle导入包)。

然而,在这种情况下,您是在外部应用程序和OSGi内的捆绑包之间进行交互。有一条硬性规定:OSGi框架不能从OSGi内部的包导入包。因此,包必须存在于外部应用程序中,并通过将其添加到FRAMEWORK\u SYSTEMPACKAGES\u EXTRA从系统包中导出。还要确保捆绑包导入该包,而不是拥有自己的副本。

顺便提一下您可能希望为包选择一个更好的名称,而不仅仅是de!我不认为您是德国唯一的Java开发人员,因此您不拥有该名称空间;-)

 类似资料:
  • 问题内容: Web服务正在返回由WSDL定义的对象,该对象为: 当我打印出该对象的类信息时,它显示为: 但我需要将此对象解组为以下类的对象: 我知道响应是正确的,因为我知道如何编组此对象的XML: 打印出: 如何将看到的对象变成我知道的对象? 此外,我在AppEngine上运行,该文件访问受到限制。 谢谢你的帮助 更新 : 我添加了注释,如下所示: 但这没有任何区别。 这与内容是的事实有关吗? 这

  • 问题内容: 如何从Java Servlet返回JSON对象。 以前,当使用servlet执行AJAX时,我返回了一个字符串。是否有需要使用的JSON对象类型,或者你只是返回了一个看起来像JSON对象的String,例如 问题答案: 我完全按照你的建议去做(返回a )。 不过,你可能会考虑将MIME类型设置为指示你正在返回JSON(根据其他stackoverflow文章,其为“ applicatio

  • 我正在调用一个函数,其中有一个订户函数。此函数必须返回一个数组,但它给出了一个错误: 缺少订阅。 如何做到这一点?

  • 我有下面的,它的返回类型是或。中的响应实体是基于的这些返回类型形成的。 如何: 1。设计以返回不同类型的 2。使根据其接收形成 这是控制器

  • 问题内容: 我正在尝试从call()返回2D数组,但遇到了一些问题。到目前为止,我的代码是: 这段代码会编译,这不会返回我的数组。我确定我可能使用了错误的语法,但是找不到任何好的示例。 编辑:改变了一点 问题答案: 添加到Joseph Ottinger的答案中,要传递要在Callable的call()方法中使用的值,可以使用闭包:

  • 我有一个包含通过构造函数创建的对象的hashmap。这些对象在hashmap中 我有一个比较两个数组的函数。一个数组是手动创建的,但第二个数组是通过一个方法创建的。我只需要来自HashMap的值。 我被这种方法困住了... 如果取出.toArray(),将得到一个“无法从集合 转换为brick” 如果将.toArray()更改为.toString(),则会得到一个“无法从String转换为bric