插入 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 插件自动找出它们。您可以通过添加“,*”来完成此操作。然后你应该删除它自己找出的所有包。
我正在 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 插件自动找出它们。您可以通过添加“,*”来完成此操作。然后你应该删除它自己找出的所有包。