无法将捆绑软件加载到felix中。我下载了Felix 6.0.1,使用
运行> java -jar bin/felix.jar
____________________________
Welcome to Apache Felix Gogo
g!
我在日食中创建一个MavenProject TestA
:
TestA/src/main/java/testa/impl/Activator.java
中创建一个类。testa.impl.Activator
扩展到org.osgi.framework.BundleActivator
。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
没有打印在控制台上?
答案 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中的清单,以验证其生成正确。