Java模块化解决方案

   网络上很多OSGi的文章上来就Activator实例,看得云里雾里。要想了解OSGi,首先要知道为什么要用

OSGi?它有哪些好处?

   首先要明确:Java缺少对高级模块化的支持。OSGi服务平台是专门针对Java对模块化支持不足的情况,

由OSGi联盟定义的一个行业标准,它引入了一个面向服务的编程模型,被称作“VM中的SOA”

Java模块化的不足

     为什么说Java缺少对高级模块化的支持?Java确实以面向对象的方式提供了某种程度的模块化,但它从未

考虑支持粗粒度的模块化编程。主要包括三个方面:

1. 可见性问题 / 信息隐藏

  • There is no mechanism for information hiding between JARs——JAR文件直接无法实现信息隐藏。

一个Java类,可以是public,也可以是package-private;但是一个Java包呢?Java提供了很多控制可见性的

访问修饰符,但这都是为了解决低层面向对象封装,而不是解决逻辑系统划分。这就导致一个问题:如果类

要在多个包之间可见,那么就必须是public!

例如,com.alpha.interface包定义了若干接口(public),com.alpha.imp包实现了这些接口
(public);可能你只想向第三方程序暴露com.alpha.interface中的接口,但你却无法阻止客户端直接
new一个实现类,因为你也暴露了 com.alpha.imp包!

如果没有OSGi,就不得不采用下面这种workaround:

  • 为了避免暴露非公有API,而把不相干的类放到同一个包中——损害程序的逻辑结构
    而如果保持程序逻辑结构而使用多个包,则又暴露了原本不想暴露的非公有API。

 

2. 易错的classpath

  • There is no runtime concept that corresponds to a JAR; they are only meaningful at build-time
  • and deploy-time. Once the Java Virtual Ma-chine is running, the contents of all the JARs are simply
  • concatenated and treated as a single, global list: the so-called “Classpath”. This model scales very
  • poorly.
  • They contain no standard metadata to indicate their dependencies.
  • They are not versioned, and multiple versions of JARs cannot be loaded simultaneous.

因为classpath隐藏了代码版本、依赖、一致性等特性,所以容易出错!

例如,同一个项目的不同组件,依赖log4j的不同版本;则类路径可能会强制选择某个可能并不合适的版本,

会找到一个并不匹配的Jar,抛出NoSuchMethodEr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值