OSGi - 第01章环境准备

基础要求:

具备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的档案站点下载,下载地址:


Felix4.2.1源码下载

下载后,将源码取出,创建一个新的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();
	}
}


我们观察到,程序第一次启动,在控制台打印出了几条错误信息以及错误堆栈。

把程序关闭,再次启动,这时候错误信息没有了。

我们稍后再来解释这个现象。

 

OSGi MiniRuntime示例环境

Felix4.2.1源码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值