基础要求:
具备Java的基础知识;
具备类加载机制的基础知识;
具备多线程相关基础知识;
具备Eclipse使用经验;
具备Maven的使用经验;
环境:
JDK6
OSGi5.0
Felix 4.2.1
POM文件:
<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>demo</groupId>
<artifactId>MiniRuntime</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>4.2.1</version>
</dependency>
</dependencies>
</project>
Felix 4.2.1的源码准备:
由于Maven中心仓库没有放置Felix4.2.1的源码,所以需要到apache的档案站点下载,下载地址:
下载后,将源码取出,创建一个新的org.apache.felix.framework-4.2.1-sources.jar文件,和felix jar文件放置到同一个目录下,就可以查看源码了。
最简化的启动程序:
package demo;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.SynchronousBundleListener;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, String> properties = new HashMap<String, String>();
FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory();
Framework framework = factory.newFramework(properties);
framework.init();
framework.getBundleContext().addBundleListener(new SynchronousBundleListener() {
@Override
public void bundleChanged(BundleEvent event) {
System.out.println("type=" + event.getType() + ", " + event);
if (event.getType() == BundleEvent.INSTALLED) {
throw new Error("eeeeeeeeeeee");
}
}
});
final List<FrameworkEvent> errors = new ArrayList<FrameworkEvent>();
framework.getBundleContext().addFrameworkListener(new FrameworkListener() {
@Override
public void frameworkEvent(FrameworkEvent event) {
if (event.getType() == FrameworkEvent.ERROR) {
errors.add(event);
if (event.getThrowable() instanceof Error) {
System.out.println("error: " + event);
//System.exit(1);
}
}
}
});
File[] files = new File("bundles").listFiles();
if (files != null) {
List<File> installingFiles = Arrays.asList(files);
Collections.sort(installingFiles);
for (File file : installingFiles) {
Bundle bundle = framework.getBundleContext().installBundle(file.toURI().toURL().toString());
bundle.start();
}
}
framework.start();
}
}
我们观察到,程序第一次启动,在控制台打印出了几条错误信息以及错误堆栈。
把程序关闭,再次启动,这时候错误信息没有了。
我们稍后再来解释这个现象。