OSGi原理与最佳实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 OSGi,拯救Java模块化的规范

在Java中,是没有模块的概念的。我们不能把一些代码组成一个模块,然后控制哪些是可以外部使用的,哪些是内部使用的。我们能用的主要有两个办法,一个是把一些内部使用的类赋予包内访问权限,但是这样在内部使用上会很不方便,因为使用这个类的类和这个类本身要在同一个包下;另外一个办法是通过文档告知它是内部类,不能在外部使用,但是这种限制很容易被忽略。而内部类被外部使用的后果是,不能轻易调整接口,因为不知道内部类是否被外部使用了。如果调整,可能会导致外部系统受很大影响。难道就没有一种机制来保证我们只暴露想暴露的部分给外部么?

答案是肯定有的,那就是OSGi(Open Service Gateway Initiative),OSGi的定义为:The Dynamic Module System For Java,从这个定义可见,OSGi的主要职责就是为了让开发者能够构建动态化、模块化的Java系统。使用OSGi后,应用就可以像搭积木一样完成搭建,例如对于一个正在运行的系统,其中一个模块使用到了日志服务,但目前系统中没有提供日志服务的模块,就可以直接从网上下载实现了日志服务API的模块,然后动态地将此模块进行安装,其他要使用日志服务的模块就可以使用了。