【问题标题】:loader constraint violation: loader (instance of x) previously initiated loading for a different type with name y加载程序约束违规:加载程序(x 的实例)先前为名称为 y 的不同类型启动加载
【发布时间】:2014-02-10 11:05:31
【问题描述】:

我将 Felix iPOJO 包装在我的框架中,称之为“MyFramework”,以简化它的一些操作。

使用 MyFramework,我有以下内容:

1- “HelloService” Bundle,它是一个 iPOJO 组件,提供打印“hello”消息作为服务。

2-“MyFrameworkComposite”捆绑包,它是另一个 iPOJO 组件,它实例化上面的“HelloService”组件并在其启动方法中检索其服务。

3- 一个启动包,它只是一个 OSGI 包,它在其启动方法中实例化“MyFrameworkComposite”组件。

4- 我的 Java 应用程序加载了 iPOJO 所需的捆绑包,以及上述 3 个捆绑包。

当我运行我的 java 应用程序时,我收到以下错误输出:

MyFramework Hello Service Bundle Started!
MyFramework Composite Bundle Started!
MyFramework Starter Bundle Started!
MyFramework Composite Started!
MyFramework Hello Service Component started!!
hello Component copy State is2
[ERROR]  : [adere-composite-0] The callback method start has thrown an exception : loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription"
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription"
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at .....................................(OTHER SIMILAR ERRORS)
done ok (Y)

错误恰好发生在以下行:(此行在我的框架代码中):

public String[] getServiceSpecifications()
{

 return this.providedServiceDescription.getServiceSpecifications();//error here

}

providedServiceDescription 是 ProvidedServiceDescription 类型,它是 org.apache.felix.ipojo.handlers.providedservice 包的一部分。

在我的“MyFrameworkComposite”组件中尝试检索“Hello Service”组件服务时,到达发生错误的行,如下所示:

ProvidedService ps= content.getProvidedService("myhelloservice.helloservice.HelloService");

我在不同的资源中读到,当您的类路径中有重复的库时,可能会导致这种情况。但我确信事实并非如此。可能是什么原因?

【问题讨论】:

    标签: java classloader apache-felix ipojo linkageerror


    【解决方案1】:

    问题来自您的 OSGi 嵌入。 OSGi 框架内部和外部使用的类不一样,因为它们的类加载器不同。你应该配置你的框架以避免这个问题:

    • 通过添加额外的系统包(这里是 iPOJO 包)
    • 通过将这些包添加到 bootdelegation

    问题和解决方法在http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-hostserviceusage进行了描述

    【讨论】:

    • @Clement 您提供的链接已失效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2011-11-20
    • 1970-01-01
    • 2011-04-15
    • 2018-01-14
    相关资源
    最近更新 更多