OSGI 包已激活,但在使用 DS 和 Apache Karaf 时从未创建组件

OSGI bundle activated, but component never created when using DS and Apache Karaf

我正在开发 Hello World 应用程序。我的应用程序是使用 Maven (3.5.0) 构建的,使用 Apache Felix 注释,并且在 Apache Karaf (4.1.1) 中是 运行。我的应用程序由一个名为 App 的组件组成,它应该立即启动。捆绑包构建成功。我可以从我的 mvn 存储库成功地将它安装到 Karaf 中。 Karaf 将包显示为 "Active"。问题是我的组件 (App) 的构造函数和激活方法从未被调用。我需要另一双眼睛来帮助我弄清楚为什么会这样。我的 pom.xml 中缺少什么?

为了完整起见,我在我的项目中创建了一个实现 BundleActivator 的激活器 class。然后我指示 Maven 将我的 Bundle-Activator 设置为这个新的 class。现在,当我在 Karaf 中安装我的包时,我可以看到我的 Activator 的日志输出。开始方法被击中。所以我知道我的包实际上开始了。我只是不明白为什么我的 App 组件从未创建和激活。

这是相关文件。

App.java

package myCompany;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;

@Component(immediate=true)
public class App 
{
    public App()
    {
        System.out.println( "App constructed" );
    }

    @Activate
    public void activate()
    {
        System.out.println( "App activated" );
    }
}

Activator.java

package myCompany;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator  implements BundleActivator{

    public void start(BundleContext context) throws Exception {
        System.out.println("Activator started");
    }

    public void stop(BundleContext context) throws Exception {
        System.out.println("Activator stopped");
    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>myCompany</groupId>
    <artifactId>myProject</artifactId>
    <packaging>bundle</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>myProject</name>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.annotations</artifactId>
            <version>1.9.6</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <version>1.24.0</version>
                <executions>
                    <execution>
                        <id>generate-scr-scrdescriptor</id>
                        <goals>
                            <goal>scr</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <version>3.3.0</version>
                <configuration>
                    <instructions>
                        <_dsannotations>*</_dsannotations>
                        <_metatypeannotations>*</_metatypeannotations>
                        <Bundle-Activator>myCompany.Activator</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

Karaf 不包含开箱即用的声明式服务支持。您需要安装 scr 功能才能激活 DS 支持:

feature:install scr

您正在使用 org.apache.felix.scr.annotations 包中的过时注释,bnd 无法识别或处理这些注释——它们需要额外的 Maven 插件才能工作。

最好迁移您的代码以使用 org.osgi.service.component.annotations 包中的 OSGi 标准注释。请参阅 OSGi Compendium Release 6 规范,第 112.8 节。