关于导入的版本处理问题

Import-Package: org.osgi.framework;version="1.8.0"

这个表示,只要是org.osgi.framework包的版本,>=1.8.0的都可以。

Import-Package: org.osgi.framework;version="[1.8.0,1.8.9)"

这个表示,只要是org.osgi.framework包的版本只能是 1.8.0 <= version < 1.8.9的都可以。其他的则不能.

例如,我将项目的依赖的org.osgi.framework改为了[1.1.0,1.1.9)后,然后启动这个bundle,就会报如下类似的错误。这是因为找不到相应的版本的依赖bundle导致的。

g! start file:/home/yang/Downloads/felix-framework-5.2.0/bundle/Example1_1.0.0.jar
org.osgi.framework.BundleException: Unable to resolve Example1 [5](R 5.0): missing requirement [Example1 [5](R 5.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.1.0)(!(version>=1.1.9))) Unresolved requirements: [[Example1 [5](R 5.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.1.0)(!(version>=1.1.9)))]
g!

在Bundle中,导入第三方非Bundle的jar包

在项目的根目录下,创建一个目录lib,然后将所有的jar包,放到这里,然后修改MANIFEST.MF文件,添加以下配置:

Bundle-ClassPath: lib/commons-lang-2.6.jar,.

每一个jar以逗号分隔隔离开,注意,要定位到jar,而不能只写目录。我也不知道为什么。我使用的是Apache Felix的OSGi实现,版本为:felix-framework-5.2.0

测试过了下,如果不定位到jar包,改为目录级,如:

Bundle-ClassPath: lib/,.

会报以下的类似错误:

ERROR: Bundle Example2 [1] Error starting file:/home/yang/Downloads/felix-framework-5.2.0/bundle/Example2_1.0.0.jar (org.osgi.framework.BundleException: Activator start error in bundle Example2 [1].)
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
	at example2.Activator.start(Activator.java:25)
	at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)
	at org.apache.felix.framework.Felix.activateBundle(Felix.java:2220)
	at org.apache.felix.framework.Felix.startBundle(Felix.java:2138)
	at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1365)
	at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils not found by Example2 [1]
	at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1558)
	at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1998)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 7 more
____________________________
Welcome to Apache Felix Gogo

g!

还要注意

这样子写了Jar包之后,千万不要再使用Import-Package来导入这些第三方包了。不然也会报以上的类似错误。

关于包的可见性问题

总之一句话, 除了java.开头的包对于任何的OSGi框架运行时都是可见的, 其他的都应该假设它是不可见的.包括javax.开头的包!!