插入 Bundle Activator 后 OSGi bundle 不启动

OSGi bundle doesn't start after inserting a Bundle Activator

我正在 Netbeans(版本 8.0.2)中实现一个 Maven Web 项目,其中一些构建配置文件(jetty、OSGi ..)由 POM 文件使用 Netbeans 中项目的插件和自定义目标管理。
我需要管理生成的 OSGi 包的生命周期,所以我创建了一个具有以下 class:

的激活器
package org.activiti.explorer.conf;


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

public class OSGiActivator implements BundleActivator {

    @Override
    public void start(BundleContext context) throws Exception {
        System.out.println("BUNDLE STARTED");
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        System.out.println("BUNDLE STOPPED");

    }

}

之后我更新了 POM 文件中的 maven bundle <plugin> 元素,添加了关于激活器的信息,所以插件是:

 <plugin>
                        <groupId>org.apache.felix</groupId>
                        <artifactId>maven-bundle-plugin</artifactId>
                        <extensions>true</extensions>
                        <configuration>
                            <supportedProjectTypes>
                                <supportedProjectType>jar</supportedProjectType>
                                <supportedProjectType>bundle</supportedProjectType>
                                <supportedProjectType>war</supportedProjectType>
                            </supportedProjectTypes>
                            <instructions>
                                <Bundle-Activator>org.activiti.explorer.conf.OSGiActivator</Bundle-Activator>
                                <Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
                                <Bundle-Version>${project.version}</Bundle-Version>
                                <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
                                <Embed-Dependency>*</Embed-Dependency>
                                <Embed-Transitive>true</Embed-Transitive>
                                <Embed-Directory>WEB-INF/lib</Embed-Directory>
                                <Web-ContextPath>activiti-explorer</Web-ContextPath>
                                <Import-Package> org.eclipse.jetty.servlet.listener,
                                    org.apache.jasper.servlet,
                                    javax.naming,
                                    javax.el;resolution:=optional,
                                    com.sun.el;resolution:=optional,
                                    org.apache.el;resolution:=optional,
                                    javax.servlet.jsp;resolution:=optional,
                                    org.apache.jasper.runtime;resolution:=optional,
                                    org.apache.tomcat;resolution:=optional,
                                    javax.servlet;version="[2.6.0,4.0.1]",
                                    javax.servlet.http;version="[2.6.0,4.0.1]",
                                    org.apache.log4j,
                                    javax.inject,
                                    org.slf4j.impl,
                                    org.slf4j,
                                    org.slf4j.spi,
                                    org.apache.commons.io;version="[1.4,2)",
                                    org.apache.commons.io.output;version="[1.4,2)",
                                    org.apache.commons.lang3;version="[3.1,4)",
                                    org.apache.commons.lang3.builder;version="[3.1,4)",
                                    org.apache.commons.lang3.exception;version="[3.1,4)"
                                </Import-Package>
                                <Export-Package>!*</Export-Package>
                            </instructions>
                            <manifestLocation>${basedir}/target/META-INF</manifestLocation>
                        </configuration>
                        <executions>
                            <execution>
                                <id>generate-manifest</id>
                                <phase>process-classes</phase>
                                <goals>
                                    <goal>manifest</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

现在,当我构建捆绑包并使用 Felix 将其加载到 OSGi 上时,捆绑包已激活但不会启动,而如果我从 POM 文件中删除有关 Bundle-Activator 的行,它会正常工作。
请注意,从 Felix 控制台没有显示有关构建 class 路径、导入包和导出包的错误,如果我尝试从 osgi 行命令启动捆绑包,则会记录此异常:

gogo: BundleException: Error starting module.

有人可以帮助我吗?如果我不使用实现 Activator 的 class 并且我不在 POM 文件中引用它,则创建的包会在 OSGi 中正常运行。

您明确列出了所有 Import-Package 语句。这意味着 maven-bundle-plugin 不会添加自动检测到的包用法。您缺少 org.osgi.framework 的 Import-Package。所以包解析但包没有连接并且在加载 OSGiActivator class 时失败。

所以简单的解决方案是添加包导入。

我宁愿建议不要定义所有导入并让 maven bundle 插件自动找出它们。您可以通过添加“,*”来完成此操作。然后你应该删除它自己找出的所有包。