(整理翻译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 Modules是Red Hat JBoss中间件中的一个模块化类加载器系统,由Mark Reinhold设计。它的设计目标是为大型企业级应用提供更高效、更隔离的类加载机制,避免类冲突,并且可以更好地控制依赖关系。 二、模块化...
JBoss模块是Java的模块化(非分层)类加载和执行环境的独立实现。 换句话说,不是将所有的JAR都加载到平面类路径中的单个类加载器,而是每个库成为一个模块,该模块仅链接到其依赖的确切模块,仅此而已。 它实现了...
JBoss Modules 是独立实现了一个 Java 模块化(非层次的)类加载和执行环境。换句话说,就是加载所有 JARs 到一个平滑的类路径,每个库都是一个模块。JBoss Modules 实现一个线程安全,快速,高并发委托类加载器模型...
在Java开发中,JBoss Wildfly是一款广泛应用的开源应用服务器,它支持模块化架构,能够有效地管理类加载和依赖关系。而Gradle作为现代Java生态系统中的主流构建工具,以其灵活的配置和强大的插件系统受到开发者们的...
- **modules目录**:模块化管理的各种模块。 - **standalone目录**:单个实例的配置文件。 - **tools目录**:JBoss相关的工具。 通过以上步骤,您可以成功安装和配置JBoss,并掌握基本的操作技巧,如启动、关闭、...
JBoss的部署结构包括`deployments`目录,用于存放应用的WAR或EAR文件,以及`modules`目录,存储Java模块。在`standalone/deployments`下添加或移除文件,可以实现应用的热部署或卸载。同时,`modules`目录允许用户...
在JBoss之前,其基于模块化的JMX内核已经相当成熟,但为了保持领先,他们希望能够集成如EJB3、JPA、Spring、Guice等不同POJO组件模型,消除它们之间的差异。 JBoss Microcontainer项目的核心目标是提供一系列特性,...
`standalone`存放服务器配置文件,`deployments`用于放置待部署的应用,`modules`则包含了JBoss的模块系统,用于加载运行时所需的类库。 5. **部署应用程序** 将你的Java EE应用打包为WAR或EAR文件,然后将其复制...
- **modules**:按模块化组织的类路径。 - **domain/standalone**:配置文件、日志和其他资源。 #### 实例分析:独立模式配置文件 下面是一个简单的`standalone.xml`配置文件示例,展示了如何定义扩展模块和子...
4. **模块加载**:JBoss模块系统会加载应用所需的类库和模块,这些模块可以在`modules`目录下找到。 5. **部署应用**:JBoss会扫描`deployments`目录下的应用包(WAR、EAR、JAR等),并进行自动部署。 6. **启动...
如果你使用的是较新的JBoss版本(如WildFly),可能需要将其放在`modules`目录下的特定模块结构中,创建一个新模块,并在module.xml文件中指定驱动的路径和依赖。 3. **配置数据源**: 在JBoss的配置文件中,通常...
6. **modules**: JBoss AS 7引入了模块化类加载系统,这使得类库的管理更加高效和隔离。每个模块都有自己的类路径,减少了类冲突的可能性。开发者可以在这里找到所有预装的模块,以及自定义模块的配置。 7. **...
5. **JBOSS_MODULES_SYSTEM_PKGS**: 这个变量用于指定在启动时需要加载的额外模块。默认情况下,它包含了`org.jboss.logmanager`,因为JBoss使用这个模块进行日志管理。 6. **JBOSS_BIND_ADDRESS**: 如果你需要将...
1. **模块化架构**:JBoss AS 3采用模块化设计,允许开发者按需加载和配置特定的Java EE组件。这提高了启动速度和资源利用率。 2. **EJB 2.1支持**:EJB(Enterprise JavaBeans)是Java EE的核心组成部分,用于实现...
3. modules目录:这是JBoss AS 7 最大的改变之一,引入了一个模块化系统。这个系统允许将依赖库组织为独立的模块,每个模块有自己的类加载器,提高了隔离性和性能。这使得应用程序可以更高效地管理和加载其依赖项,...
3. **JBoss Modules**: JBoss应用服务器使用模块化设计,每个模块都有自己的类加载器。当模块的代码发生变化时,可以只更新对应模块的类加载器,而不会影响其他模块。 4. **重新部署策略**: 开发者可以通过控制台...