模块化Java简介
2009-12-21 00:00:00 来源:WEB开发网因此,模块的编译时classpath可能会与运行时classpath有些微妙的差别。此外,每个模块通常都是独立编译的(模块A可能是用模块C 1.1 来编译的,而模块B则可能是用模块C 1.2 来编译的),而另一方面,在运行时则是使用单一的路径(在本例中,即可能是模块C的1.1版本,也可能是1.2版本)。这就会导致依赖地狱(Dependency Hell),特别当它是这些依赖传递的末尾时更是这样。不过,像Maven和Ivy这样的构建系统可以让模块化特性对开发者是可见的,甚至对最终用户也是可见的。
Java有一个非常好的底层特性,叫做ClassLoader,它可以让运行时路径分得更开。通常情况下,所有类都是由系统ClassLoader装载的;可是有些系统使用不同的ClassLoader将其运行时空间进行了划分。Tomacat(或者其他Servlet引擎)就是一个很好的例子,每个Web应用都有一个ClassLoader。这样Web应用就不必去管(无论有意与否)在同一JVM中其他Web应用所定义的类。
这种方式下,每个Web应用都用自己的ClassLoader装载类,这样一个(本地)Web应用实现装载的类不会与其他Web应用实现相冲突。但这就要 求对任何ClassLoader链,类空间都是一致的;这意味着在同一时刻,你的VM可以同时从两个不同的Classloader中各自装载一个Util.class,只要这两个ClassLoader互相不可见。(这也是为什么Servlet引擎具有无需重启即可重新部署的能力;扔掉了一个ClassLoader,你也就扔掉了其引用类,让老版本符合垃圾回收的条件——然后让Servlet引擎创建一个新的ClassLoader并在运行时中重新部署应用类的新版本。)
再谈模块
构建一个模块化系统实际上是把系统划分成(有可能)可重用模块的过程,并使模块间耦合最小化。同时,其也是一个减少模块需求耦合的过程:例如,Eclipse IDE许多plugin对GUI和非GUI组件(如jdt.ui和jdt.core)的依赖是分开的,这样就可以在IDE环境之外使用这些非GUI模块(headless builds、分析及错误检查等等)。
更多精彩
赞助商链接