Freud's Blog

Stay hungry, stay foolish. 少年辛苦终身事,莫向光阴惰寸功。

JAVA OSGi(一)-传统的java模块化

Posted on By Freud Kang

  • 创建一个新的java project,命名为ServiceProvider

  • com.freud.service包下创建一个新的interface,命名为HelloWorldService

package com.freud.service;

public interface HelloWorldService {

	public void sayHello(String name);
}
  • com.freud.service.impl包下创建一个新的java类,命名为HelloWorldServiceImpl
package com.freud.service.impl;

import com.freud.service.HelloWorldService;

public class HelloWorldServiceImpl implements HelloWorldService {

	@Override
	public void sayHello(String name) {
		System.out.println("Hello," + name);

	}

}
  • src下新建一个Folder,命名为META-INF,并在META-INF下创建一个folder命名为services,一个文件命名为MANIFEST.MF
Manifest-Version: 1.0
  • services目录下创建一个文件命名为com.freud.service.HelloWorldService 其中的内容为:
com.freud.service.impl.HelloWorldServiceImpl
  • 将项目导出为jar到一个本地目录,命名为ServiceProvider.jar

  • 新建一个Java Project,命名为ServiceConsumer,并添加ServiceProvider.jar为外部jar依赖

  • com.freud.service.test目录下添加一个测试类HelloWorldTest

package com.freud.service.test;

import java.util.Iterator;
import java.util.ServiceLoader;

import com.freud.service.HelloWorldService;

public class HelloWorldTest {

	public static void main(String[] args) {

		ServiceLoader<HelloWorldService> serviceLoader = ServiceLoader
				.load(HelloWorldService.class);

		Iterator<HelloWorldService> ite = serviceLoader.iterator();

		while (ite.hasNext()) {
			ite.next().sayHello("World");
		}

	}
}
  • 执行测试类
总结 当Consumer类调用HelloWorldService的时候,并不需要去关注在Provider中的服务具体实现是什么,而是只需要去关注Service的接口就可以了,对接口的实现在Provider中。
缺点 实现类在打包发布之后,还是暴露给了Consumer,而这对Consumer来说,是完全没有用的东西。


参考资料

视频教程 : http://v.youku.com/v_show/id_XNDE1NzU0OTY0.html
Equinox OSGi官网 : http://www.eclipse.org/equinox/
林昊 : 《OSGi原理与最佳实践》
Richard S. Hall : 《OSGi实战》