Java &引用;不能强制转换为org.osgi.framework.BundleActivator“;以声明方式启动OSGi捆绑包时

Java &引用;不能强制转换为org.osgi.framework.BundleActivator“;以声明方式启动OSGi捆绑包时,java,spring,maven,osgi,osgi-bundle,Java,Spring,Maven,Osgi,Osgi Bundle,这种基于Spring的遗留java应用程序在容器中运行。我试图通过在这个已经存在的应用程序中嵌入ApacheFelix来提供一些OSGi插件功能。我声明性地启动框架,方法如下: 如果链接不起作用,我要做的是将Felix作为maven依赖项导入,使用ServiceLoader获取对框架工厂的引用,启动框架,并加载/启动特定目录中的所有捆绑包 该捆绑包是通过Felix捆绑包插件创建的,配置如下: <groupId>org.apache.felix</gro

这种基于Spring的遗留java应用程序在容器中运行。我试图通过在这个已经存在的应用程序中嵌入ApacheFelix来提供一些OSGi插件功能。我声明性地启动框架,方法如下:

如果链接不起作用,我要做的是将Felix作为maven依赖项导入,使用ServiceLoader获取对框架工厂的引用,启动框架,并加载/启动特定目录中的所有捆绑包

该捆绑包是通过Felix捆绑包插件创建的,配置如下:

            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Export-Package>com.example</Export-Package>
                    <Import-Package>!*</Import-Package>
                    <Bundle-Name>${project.description}</Bundle-Name>
                    <Bundle-Activator>com.example.Activator</Bundle-Activator>
                    <Embed-Transitive>true</Embed-Transitive>
                </instructions>
            </configuration>
我已经设法将其简化为BundleActivator接口有两个实例:一个在bundle的类加载器中,另一个在框架的ModuleClassLoader中。至少我认为是这样的


人们通常是如何解决这个问题的?我尝试创建另一个bundle,它只导出框架以供初始bundle导入,但该bundle在启动时遇到相同的错误。将spring应用程序重构为具有全面OSGi功能是不可能的(这就是为什么我使用Felix而不是Equinox)。

捆绑包不能有自己的OSGi框架类内部副本(即包
org.OSGi.Framework
及其子包)。他们必须从系统包中导入这些包


ClassCastException
的原因是,在Java中,类的标识是其完全限定名和定义它的类加载器的组合。如果您在多个类加载器中定义了
BundleActivator
类型(当您在bundle中有它的副本时会发生这种情况),那么它们被视为不同的类型。

尝试将依赖框架范围从compile更改为provided

,这是有意义的。在这种情况下,我如何声明我的系统包中有Osgi内容供我的包使用?该框架嵌入在一个不支持Osgi的spring应用程序中运行。如果我只是不将osgi依赖项嵌入包中,我会得到一个ClassNotFoundException,然后,框架将为捆绑包提供一个捆绑包类加载器,该加载器可以将
org.osgi.framework
包导入框架的系统捆绑包。您可能会得到一个ClassNotFoundException,因为您的捆绑包的
META-INF/MANIFEST.MF
中没有
Import-package:org.osgi.framework
。这又是因为您禁用了pom此行的所有导入:
*。你应该去掉那条线。
<dependencies>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.framework</artifactId>
        <version>6.0.1</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
14:43:52,981 ERROR [con.example.Plugin] (Initialization Thread) Failed to start bundle com.example: org.osgi.framework.BundleException: Activator start error in bundle com.example.Plugin[2].
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2448)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2304)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)

Caused by: java.lang.ClassCastException: com.example.Activator cannot be cast to org.osgi.framework.BundleActivator
    at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4744)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2379)
    ... 35 more