Felix没有开始捆绑

时间:2019-01-07 10:06:07

标签: java maven osgi apache-felix

无法将捆绑软件加载到felix中。我下载了Felix 6.0.1,使用

运行
> java -jar bin/felix.jar
____________________________
Welcome to Apache Felix Gogo

g! 

我在日食中创建一个MavenProject TestA

  1. 我向提供的felix(6.0.1)添加了依赖项。
  2. 我在TestA/src/main/java/testa/impl/Activator.java中创建一个类。
  3. 我将类testa.impl.Activator扩展到org.osgi.framework.BundleActivator
  4. 我覆盖了public void start(BundleContext bc) throws Exception以打印出Hello World!

这是java来源:

package testa.impl;

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

public class Activator implements BundleActivator {

    public void start(BundleContext arg0) throws Exception {
        System.out.println("Hello World!");
    }

    public void stop(BundleContext arg0) throws Exception {
        System.out.println("stop");
    }
}

这是我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>testa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.main</artifactId>
            <version>6.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <defaultGoal>clean install org.apache.felix:maven-bundle-plugin:bundle</defaultGoal>
    </build>
</project>

然后我使用mvn编译为jar并使用

加载
g! install file:/C:/xxx/TestA/target/testa-0.0.1-SNAPSHOT.jar                              
Bundle ID: 20

然后我使用lb

列出所有捆绑包
g! lb                                                                                                           15:51:56
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (6.0.1)|6.0.1
    1|Active     |    1|jansi (1.17.1)|1.17.1
    2|Active     |    1|JLine Bundle (3.7.0)|3.7.0
    3|Active     |    1|Apache Felix Bundle Repository (2.0.10)|2.0.10
    4|Active     |    1|Apache Felix Gogo Command (1.0.2)|1.0.2
    5|Active     |    1|Apache Felix Gogo JLine Shell (1.1.0)|1.1.0
    6|Active     |    1|Apache Felix Gogo Runtime (1.1.0)|1.1.0
   20|Installed  |    1|testa (0.0.1.SNAPSHOT)|0.0.1.SNAPSHOT
g!                                                                                                              

无论如何,我都使用start启动捆绑包:

g! start 20
g!

我原本希望打印“ Hello World”,但什么都没出现!

我现在很困惑,尝试找出捆绑包是否真正开始。

g! lb                                                                                                           15:51:56
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (6.0.1)|6.0.1
    1|Active     |    1|jansi (1.17.1)|1.17.1
    2|Active     |    1|JLine Bundle (3.7.0)|3.7.0
    3|Active     |    1|Apache Felix Bundle Repository (2.0.10)|2.0.10
    4|Active     |    1|Apache Felix Gogo Command (1.0.2)|1.0.2
    5|Active     |    1|Apache Felix Gogo JLine Shell (1.1.0)|1.1.0
    6|Active     |    1|Apache Felix Gogo Runtime (1.1.0)|1.1.0
   20|Active     |    1|testa (0.0.1.SNAPSHOT)|0.0.1.SNAPSHOT
g!                                                                                                              15:51:58

它已启动,但是我的代码尚未执行。

问题

为什么Hello World没有打印在控制台上?

2 个答案:

答案 0 :(得分:1)

您似乎正在手动创建清单。您应该使用bnd-maven-plugin之类的工具来执行此操作。由于您是手动创建清单的,因此它似乎是错误的。您不导入您在代码中使用的包。即org.osgi.framework

此外,请勿从其他人的代码扩展激活器类,因为通常无法导入其实现包。只需自己实施即可:

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

public class TestA implements BundleActivator {

答案 1 :(得分:1)

Hello World不在控制台上打印,因为您创建的jar实际上不是捆绑包。 奇怪的是,felix允许您启动清单中没有任何OSGI相关信息的jar。 我不清楚启动这样的捆绑意味着什么?也许这些课程被发布了,也许没有。

大多数Java框架都在jar中扫描文件,并使用反射或字节码分析来找到相关的类。 对于普通框架,在启动时扫描jar的开销仅发生一次。 OSGI被设计为轻量级的,还用于移动设备。 而且,由于OSGI中的捆绑包可以来来去去,所以他们设计了一种更有效的方法。 OSGI捆绑软件将元数据存储在清单中。 这是一个简单的文本文件,始终在同一位置(在jar中):“ META-INF / MANIFEST.MF”。 如果您使用zip工具检查jar中的文件,则应该看到类似以下内容的

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Peter Rader
Build-Jdk: 1.8.0_111

对于以后的OSGI故障排除,我建议您检查(并发布)所创建的清单。

有效的OSGI清单应如下所示:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Peter Rader
Build-Jdk: 1.8.0_111
Bundle-Name: testa
Bundle-SymbolicName: testa.impl
Bundle-Version: 1.0.0
Bundle-Activator: testa.impl.Activator
Import-Package: org.osgi.framework

当felix读取此清单时,它将使用“捆绑激活器”条目查找激活器(如果有)。 更换清单,并且捆绑包应正常部署。
只需创建一个名为“ META-INF / MANIFEST.MF”的文本文件,其中包含相对于jar的位置中的上述文本。 接下来,使用以下linux命令(或您喜欢的zip工具)替换jar中的清单文件:

zip testa-0.0.1-SNAPSHOT.jar -u META-INF/*

zip命令的预期输出:

updating: META-INF/MANIFEST.MF (deflated 36%)

请确保使用一个zip文件打开广口瓶,并检查内容是否已更改。 现在,如果您安装并启动该捆绑软件,它将显示“ Hello World!”。

尽管可以解决问题,但这不是一个很干净的解决方案。
jar规范对于清单中的条目应如何格式化有一些相当奇怪的规则:
https://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Manifest_Specification
最值得注意的是:

No line may be longer than 72 bytes (not characters), in its UTF8-encoded form.
If a value would make the initial line longer than this, 
it should be continued on extra lines (each starting with a single SPACE).

因此,您不想手动编辑此文件。 正如其他人所说,您可以使用各种选项来自动生成OSGI清单。 和以前一样,您可以检查生成的jar中的清单,以验证其生成正确。