插入Bundle Activator后,OSGi包没有启动

时间:2016-01-12 14:43:37

标签: maven netbeans osgi netbeans-8 apache-felix

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

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控制台中没有显示有关Build类路径,导入的包和导出的包的错误,如果我尝试从osgi line命令启动bundle,则会记录此异常:

gogo: BundleException: Error starting module.

有人能帮助我吗?如果我没有使用实现Activator的类,并且我没有在POM文件中引用它,则创建的bundle在OSGi中正常运行。

1 个答案:

答案 0 :(得分:3)

您明确列出了所有Import-Package语句。这意味着maven-bundle-plugin不会添加自动检测到的包使用情况。您缺少org.osgi.framework的Import-Package。所以bundle解析但是包没有连线,加载OSGiActivator类时它失败了。

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

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