使用JBoss Modules模块化java

(整理翻译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再也不会看到依赖里一个冲突版本的类,或者加载到一个根本不需要加载的资源。同时,如果一个模块用到才被加载能够极大的提高大型应用的启动时间。

还在等待?

  •       JBoss Modules是一个独立的运行在JDK6和以上版本的模块系统。它支持以下特性(或者更多):
  •       高效的使用内存,提供高性能,多线程类加载实现, 在o(1)的时间复杂度内加载任何的类和资源。
  •       可扩展的模块加载系统,允许用户配置其他可替代实现的模块定义/加载策略。 方便使用的本地模块加载器,能够用一种简单的可预测的结构从文件系统上加载Jar文件,或者是展开的目录
  •     简单的启动过程(参看以下内容)
  •   提供一系列运行时的API ,通过这些API可以加载模块,获得模块的类加载器,在运行时创建模块,扩展JDK service加载机制,使其成为一个能够识别模块,并且能够提供对平台native代码更多的管理。

 
一个模块化程序使用以下命令启动:

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比起来有这么几个优点:

  • 目前已经可用。现在还不知到JDK的模块系统什么时候可用,可能会在2012年发布的Java7里,java 8或者更为更晚。JBoss Modules是一个今天你就可以马上使用和贡献的项目。
  • 不用语言,二进制或者编译器的支持,也不需要任何JCP的支持。
  • JBOSS Modules会与JSR294兼容,如果Jigsaw项目能够稳定,并且成为OpenJDK的一部分,我们会维护jboss modules的兼容性。


和OSGI相比:

  • JBoss Modules更简单。一个Jar文件是你所有需要去运行模块化的应用。
  • 它更为小巧:没有osgi的sevice层,或者其他OSGI提供的更高层次的功能.它只做一件事情,并且要把它做好。
  • 同时,它的功能又十分强劲。它可以成为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年发布.

 

你可能感兴趣的:(modules,JDK7,jboss7,jigsaw)