OSGi Bundle 不以 Felix 主机应用程序启动
OSGi Bundle not starting with Felix Host application
我在主机应用程序中使用 Apache Felix 以提供在运行时加载扩展的能力。该机制运行良好,但如果我包含某些依赖项,我对捆绑包有一些非常喜怒无常的行为。例如,如果我在 pom.xml 中使用以下内容:
<packaging>bundle</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Bundle-Version>1.0.0</Bundle-Version>
<Bundle-Activator>${pom.groupId}.activator.Activator</Bundle-Activator>
<Include-Resource>{maven-resources}, {maven-dependencies}</Include-Resource>
<Import-Package>*</Import-Package>
<Embed-Dependency>jackson-core</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>co.ff36</groupId>
<artifactId>halo.core</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
一切正常,包注册并启动。但是,如果我在捆绑包中包含 async-http-client
,它会注册但不会启动!我已经尝试将依赖项嵌入包中,即使父级主机应用程序公开了它。如果我查看已编译的包,jar 已包含在内,但它仍然不会真正启动。
我尝试添加:
<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>
并修改:
<Embed-Dependency>jackson-core, async-http-client</Embed-Dependency>
这些选项都不起作用。我在主机应用程序中没有收到任何错误,我只是无法弄清楚为什么某些库会导致此问题,而其他库不会。
Jackson 可以作为 OSGi 包访问,您无需嵌入它。如果您有 felix webconsole 或其他类型的控制台,您可以检查未显示的导入(或功能)导致捆绑包无法进入 ACTIVE 状态。由于 POM 显示了传递形式中包含的所有依赖项。使用它不是一个好主意,因为这意味着没有 类 从其他包中加载,而不是嵌入所有内容,这意味着您创建了一个不使用任何包的整体包。
无法启动的另一个可能原因是激活器调用了一些方法,该方法会引发异常,这将使您的激活器无效,如 OSGi 规范所定义的那样。建议检查你的日志,也许代码中有一些无法解析的反射实例化 类,因为它不是由 bundle 插件显示的 - 只能导入在 类 导入中显示的包。
进一步调查发现问题与版本控制有关。创建的包 MANIFEST.MF
明确说明了某些导入包的版本:
Import-Package: ...,com.fasterxml.jackson.core.type;version="[2.4,3)",com.ning.http.client;version="[1.9,2)",
org.osgi.framework;version="[1.5,2)"
但是,宿主应用程序没有指定版本:
Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA -> ... com.ning.http.client ...
看来版本必须在主机中明确说明,并且必须与捆绑包导入相匹配,否则捆绑包将无法激活。
我在主机应用程序中使用 Apache Felix 以提供在运行时加载扩展的能力。该机制运行良好,但如果我包含某些依赖项,我对捆绑包有一些非常喜怒无常的行为。例如,如果我在 pom.xml 中使用以下内容:
<packaging>bundle</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Bundle-Version>1.0.0</Bundle-Version>
<Bundle-Activator>${pom.groupId}.activator.Activator</Bundle-Activator>
<Include-Resource>{maven-resources}, {maven-dependencies}</Include-Resource>
<Import-Package>*</Import-Package>
<Embed-Dependency>jackson-core</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>co.ff36</groupId>
<artifactId>halo.core</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
一切正常,包注册并启动。但是,如果我在捆绑包中包含 async-http-client
,它会注册但不会启动!我已经尝试将依赖项嵌入包中,即使父级主机应用程序公开了它。如果我查看已编译的包,jar 已包含在内,但它仍然不会真正启动。
我尝试添加:
<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>
并修改:
<Embed-Dependency>jackson-core, async-http-client</Embed-Dependency>
这些选项都不起作用。我在主机应用程序中没有收到任何错误,我只是无法弄清楚为什么某些库会导致此问题,而其他库不会。
Jackson 可以作为 OSGi 包访问,您无需嵌入它。如果您有 felix webconsole 或其他类型的控制台,您可以检查未显示的导入(或功能)导致捆绑包无法进入 ACTIVE 状态。由于 POM 显示了传递形式中包含的所有依赖项。使用它不是一个好主意,因为这意味着没有 类 从其他包中加载,而不是嵌入所有内容,这意味着您创建了一个不使用任何包的整体包。
无法启动的另一个可能原因是激活器调用了一些方法,该方法会引发异常,这将使您的激活器无效,如 OSGi 规范所定义的那样。建议检查你的日志,也许代码中有一些无法解析的反射实例化 类,因为它不是由 bundle 插件显示的 - 只能导入在 类 导入中显示的包。
进一步调查发现问题与版本控制有关。创建的包 MANIFEST.MF
明确说明了某些导入包的版本:
Import-Package: ...,com.fasterxml.jackson.core.type;version="[2.4,3)",com.ning.http.client;version="[1.9,2)",
org.osgi.framework;version="[1.5,2)"
但是,宿主应用程序没有指定版本:
Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA -> ... com.ning.http.client ...
看来版本必须在主机中明确说明,并且必须与捆绑包导入相匹配,否则捆绑包将无法激活。