(整理翻译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年发布.
分享到:
相关推荐
jboss-modules, 模块化加载系统 这是JBoss模块项目。JBoss模块是Java模块化的( 非分级) 类加载和执行环境的独立实现。 也就是说,每个类库装入的不是一个单独的类路径,而是将每个库变成一个只依赖于它所依赖的确切...
JBoss Modules 是一个适用于Java的模块化(非分层)类加载以及执行环境的实现。换句话说,不同于Java传统的使用单个类加载器载入classpath中的所有JAR文件,每一个库(library,可以理解为完成某一个功能的一系列jar的...
JBoss模块是Java的模块化(非分层)类加载和执行环境的独立实现。 换句话说,不是将所有的JAR都加载到平面类路径中的单个类加载器,而是每个库成为一个模块,该模块仅链接到其依赖的确切模块,仅此而已。 它实现了...
JBoss Modules 是独立实现了一个 Java 模块化(非层次的)类加载和执行环境。换句话说,就是加载所有 JARs 到一个平滑的类路径,每个库都是一个模块。JBoss Modules 实现一个线程安全,快速,高并发委托类加载器模型...
使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如Url填写清楚,IP地址写对了,报错或者抛异常神马的别怪我,调输入校验好蛋疼。 本工具与网上已公布工具优点: 1. ...
使用JAVA基于JBOSS实现ESP使用JAVA基于JBOSS实现ESP
本书以丰富的示例,讲述在主流Java EE服务器——JBoss上开发Java EE程序的技术,包括Web(JSP、Servlet、MVC)、EJB(EJB 2.x)和EJB 3.0、JMS、Web Service、Hibernate、AOP等。正文讲述的所有内容,全部都有可运行...
JBoss AS 7.1.1第一部分
jboss中间件的反序列化漏洞检测工具,可检测主机搭建的中间件并获得shell
因为JBoss代码遵循LGPL许可,你可以在任何商业应 用中免费使用它,而不用支付费用。JBoss是纯Java的Web应用服务器,为了保证JBoss服务器的正常运行,在安装JBoss之前首先要确保系统 已经安装了JDK。可以从...
通过JBOSS4 commons-collections.jar包的反序列化类InvokerTransformer, InstantiateFactory 和 InstantiateTransfromer class 文件可以远程操控服务器
设置DefaultCacheTimeout,DefaultCacheResolution的值为0,这个我就不多说了,请参阅我的上一篇 <br>文章《在JBoss中自己定义JAAS登录模块处理登录事件》。 <br>6.配置完后将TestLoginMoudle.war复制到你的...
JBOSS使用指南JBOSS使用指南JBOSS使用指南JBOSS使用指南JBOSS使用指南JBOSS使用指南JBOSS使用指南JBOSS使用指南
一本不错的文档书,内容很少,简洁,让您能快速使用Jboss部署web项目。
ejb java jboss welogic java6 java5 ejb3 session bean
当时遇到这个问题org.jboss.naming.remote.client.InitialContextFactory(WFLYNAM0027 : ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory) 去外网下载了这个,成功通过了
jboss-modules-1.9.2.Final.jar,最新JBoss程序,Linux、Ubuntu下适用。
jboss,java,eclipse,flex
JBOSS使用手册 JBOSS使用手册 JBOSS使用手册
看就是,绝对值。这是一个有经验的高级工程师编写的用于企业内部使用的资料,或许您该去看看。 高工的,呵呵