我在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中正常运行。
答案 0 :(得分:3)
您明确列出了所有Import-Package语句。这意味着maven-bundle-plugin不会添加自动检测到的包使用情况。您缺少org.osgi.framework的Import-Package。所以bundle解析但是包没有连线,加载OSGiActivator类时它失败了。
所以简单的解决方案是添加包导入。
我宁愿建议不要定义所有导入,让maven bundle插件自动识别它们。您可以通过添加“,*”来完成此操作。然后,您应该删除它自己计算出的所有包。