(整理翻译By Jim Ma)
前一篇blog中Jason Green提到JBoss Modules对JBoss AS7的提速起了很打的作用,JBoss Modules的作者David,在这篇博客 中为我们介绍了JBoss Modules的特性,以及和其他类似实现的对比。下面是这篇blog的译文,是了解学习java module和jboss modules一个好的开始:
一年前Mark Reinhold(Sun/Oracle的顶尖Java工程师之一)在JavaOne上宣称“classpath已死",在之后它又写了一系列的博客来阐述这一观点,并且宣告Java的未来是模块化。与此同时,JDK7的发布已经大幅推迟 [译者注解1] , 我们可能在2012,或以后才能见到JDK中java模块的实现。而JSR294的参与人员一直是走走停停,缓慢的寻求一个和java语言结合紧密的java 模块化标准,这可能是因为需要语言,二进制代码和打包方面的支持。
我一直在想商讨起草一个可用而且不错的模块化标准用不了这么长时间。我用在JBossAS7概念证明(proof-of-concept)时创建的JBoss Modules证明了我的想法。
什么是模块?
如果你没有跟踪JDK7的开发,你可能错过了这个概念。
一个模块是一些类、资源的集合,和一个相关的类加载器。模块可以表示成另外一个模块的依赖。 从依赖里“exported"的类和资源对于依赖它的模块里边的类是可见的。可见是指一个类加载器里加载的类能够“看到”另外一个加载器里的类。“export"一个类或者资源意味着这个类可以被依赖看到。
所以一个模块系统提供一种方法将类和资源打包成为模块,并且在运行时建立一个类加载的图,这样所有表达的依赖关系都可以被这个模块系统实现。
模块的突出优点
传统运行一个java应用的方法是使用常用的classpath机制。它会创建一个application的类加载器,并且所有相关jar文件资源提供的class联系汇聚到一起成为一个大块。
现在可以想象如果有一个很大很复杂的应用,包含很多的Jar文件,并且有些jar在所有的时候都不会使用,或者有些jar因为冲突的依赖关系会有几个不同的版本。这些问题我们习惯性的称之为"JAR Hell".
模块可以极大的缓解这个问题。如果所有的jar都打包成为模块,一个jar再也不会看到依赖里一个冲突版本的类,或者加载到一个根本不需要加载的资源。同时,如果一个模块用到才被加载能够极大的提高大型应用的启动时间。
还在等待?
一个模块化程序使用以下命令启动:
java -jar jboss-modules.jar -mp path/to/modules my.main.module.name
在模块路径(-mp)中需要制定默认模块加载器需要搜素加载模块的根目录。一个模块使用简单的XML描述符进行定义,如:
<module xmlns="urn:jboss:module:1.0" name="org.jboss.msc">
<main-class name="org.jboss.msc.Version"/>
<resources>
<resource-root path="jboss-msc-1.0.0.Beta3.jar"/>
</resources>
<dependencies>
<module name="org.jboss.logging"/>
<!-- Optional deps -->
<module name="javax.inject.api" optional="true"/>
<module name="org.jboss.threads" optional="true"/>
<module name="org.jboss.vfs" optional="true"/>
</dependencies>
</module>
在jboss-moduels.jar里有一个schema文件来定义模块描述符的格式,因此集成到你喜欢的IDE中会很容易。JBoss Moduels提供了很多扩展的功能去严格控制什么java包是“exported"或者“imported',所以你可以从你的 Jar文件里选择性的不包含一些资源(这样使用预打包的jar文件时将变得更为简单)
和JSR 294相比:
这个简单的模块系统和目前的JSR294比起来有这么几个优点:
和OSGI相比:
目前项目的状态:
现在JBoss Modules已经可以通过maven引用: "org.jboss.modules:jboss-modules".同时我们有一个Jira可以报告问题。在FreeNode IRC上的#jboss-msc可以参与AS7与模块有关的讨论(可以在webchat上通过注册的nickname参与)。源代码目前在GitHub上面可以找到。
那...你还在等什么?
[译者注解1]:原文发布于2010年9月,根据 Mark Reinhold blog 中的消息, jdk7会在2012年发布.