如何从代码中启动和使用 Apache Felix?
Posted
技术标签:
【中文标题】如何从代码中启动和使用 Apache Felix?【英文标题】:How to start and use Apache Felix from code? 【发布时间】:2010-12-25 15:50:34 【问题描述】:我在代码中找不到有关启动和使用 Apache Felix的信息。
我想用 Apache Felix 的 Shell 做我能够(或不能;)) 做的事情。
例如,如何启动一个模块?
请帮忙。
【问题讨论】:
关于这个问题的完整答案,你们可以参考这个example(感谢 killbill 团队)。 【参考方案1】:所以,在尝试了很多时间之后,这里有一个可能的解决方案。
我们将有两个项目:
OsgiModuleA,其中包含一个待启动的模块 OsgiUsage,它将使用“模块 A”项目 OsgiModuleA
文件模块/a/Activator.java
package module.a;
import org.osgi.framework.*;
public class Activator
implements BundleActivator, ServiceListener
@Override
public void start(BundleContext bc)
throws Exception
System.out.println("*** started");
bc.addServiceListener(this);
@Override
public void stop(BundleContext bc)
throws Exception
bc.removeServiceListener(this);
System.out.println("*** stopped");
@Override
public void serviceChanged(ServiceEvent se)
String s;
switch (se.getType())
case ServiceEvent.MODIFIED:
s = "modified";
break;
case ServiceEvent.REGISTERED:
s = "registered";
break;
case ServiceEvent.UNREGISTERING:
s = "unregistered";
break;
default:
s = "unknown";
System.out.println("= = = service changed: " + s);
文件清单.mf
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Bundle-Name: Module A
Bundle-Description: Module A
Bundle-Vendor: me
Bundle-Version: 1.0.0
Bundle-Activator: module.a.Activator
Import-Package: org.osgi.framework
项目 OsgiUsage
文件使用/Main.java
package usage;
import java.util.*;
import org.apache.felix.framework.*;
import org.apache.felix.framework.util.*;
import org.osgi.framework.*;
public class Main
static class HostActivator
implements BundleActivator
private BundleContext context = null;
@Override
public void start(BundleContext bc)
context = bc;
@Override
public void stop(BundleContext bc)
context = null;
public BundleContext getContext()
return context;
public static void main(String[] args)
throws Exception
Map<String, Object> map = new HashMap<String, Object>();
map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
"some.module.i.dont.know; version=1.0.0");
HostActivator activator = new HostActivator();
List<Object> list = new LinkedList<Object>();
list.add(activator);
map.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
Felix f = new Felix(map);
System.out.println("starting OSGI...");
f.start();
Bundle b = f.getBundleContext().installBundle(
"file:../OsgiModuleA/dist/OsgiModuleA.jar"); // dirty path ;)
String bName = b.getLocation();
System.out.println("starting bundle " + bName);
b.start();
Set<String> inUse = new HashSet<String>();
for (ServiceReference sr : f.getServicesInUse())
inUse.add(sr.toString());
for (ServiceReference sr : f.getRegisteredServices())
String flag = (inUse.contains(sr.toString()) ? "[in use]" : "[ ]");
System.out.println("+ registered service: " + flag + " " + sr.toString());
System.out.println("stopping bundle " + bName);
b.stop();
System.out.println("uninstalling bundle " + bName);
b.uninstall();
System.out.println("stopping...");
f.stop();
f.waitForStop(1000);
输出
starting OSGI...
starting bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
*** started
+ registered service: [in use] [org.osgi.service.startlevel.StartLevel]
+ registered service: [ ] [org.osgi.service.packageadmin.PackageAdmin]
stopping bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
*** stopped
uninstalling bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
stopping...
【讨论】:
“为什么我的服务没有出现”:那是什么服务?在您显示的代码中,您没有注册任何服务。 请为“如何在 OSGi 中注册服务”打开一个新问题。 创建新问题:***.com/questions/1893116/… 标记为正确,因为问题是关于 starting 和 using Apache Felix。以上是关于如何从代码中启动和使用 Apache Felix?的主要内容,如果未能解决你的问题,请参考以下文章
在 IntelliJ IDEA 11 中运行 Apache Felix 4.0.2
OSGi 捆绑包未启动:缺少要求 osgi.wiring.package; > &(osgi.wiring.package=org.apache.felix.dm)