本文的英文原文Modularized Java with JBoss Modules是JBoss Modules的作者David写的,由HollisChuang翻译在使用JBoss Modules来模块化Java中。转载请注明出处!!!

一年前Mark Reinhold(Sun/Oracle的顶尖Java工程师之一)在JavaOne上宣称“classpath已死”,在之后它又写了一系列的文章来阐述这一观点,并且宣告Java的未来是模块化。与此同时,JDK7的发布已经大幅推迟,我们可能在2012,或以后才能见到JDK中java模块的实现。而JSR294的参与人员一直是走走停停,缓慢的寻求一个和java语言结合紧密的java模块化标准,这可能是因为需要语言,二进制代码和打包方面的支持。
我一直在想商讨起草一个可用而且不错的模块化标准用不了这么长时间。我用在JBossAS7概念证明(proof-of-concept)时创建的JBoss Modules证明了我的想法。

什么是模块(Module)?

如果你没有关注JDK7的发展,你可能都不知道自己错过了这个概念。
模块由一些类、资源集合而成,并且关联一个类加载器。一模块可以依赖另外一个模块。 从被依赖的模块里导出(export)的类和资源对于依赖它的模块里边的类是可见的(visible)。可见是指一个类加载器里加载的类能够“看到”另外一个加载器里的类(译者注:其实就是可以调用其api)。导出(export)一个类或者资源意味着这个类可以被依赖看到。

所以一个模块系统提供一种方法将类和资源打包成为模块,并且在运行时建立一个类加载的图表,这样所有表达的依赖关系都可以被这个模块系统实现。

模块(Module)的突出优点

在Java中运行应用程序的传统方法是使用著名的classpath机制。它会创建一个application的类加载器,并且把所有相关jar文件资源汇聚到一起成为一个大块(blob)。

假如你有一个非常庞大的应用,其中包含了很多的jar文件,并且有些jar在可能根本不会被用到,或者有些jar会有多个相互冲突的不同版本。这些问题我们习惯性的称之为”JAR Hell“. (译者注:有过web开发经验的都知道,很多classNotFound类型的错误都是由于jar包冲突或者版本不一致导致的)

模块可以极大的缓解这个问题。如果所有的jar都打包成为模块,一个jar再也不会看到依赖里一个冲突版本的类,或者加载到一个根本不需要加载的资源。同时,如果一个模块用到才被加载能够极大的提高大型应用的启动时间。

还不赶快行动?

JBoss Modules是一个独立的运行在JDK6及以上版本的模块系统。它支持以下特性(或者更多):

1、高效的使用内存,提供高性能,多线程类加载实现, 在o(1)的时间复杂度内加载任何的类和资源。

2、可扩展的模块加载系统,允许用户配置其他可替代实现的模块定义/加载策略。

3、方便使用的本地模块加载器,能够用一种简单的可预测的结构从文件系统上加载Jar文件,或者是展开的目录

4、简单的启动过程(参看以下内容)

5、提供一系列运行时的API ,通过这些API可以加载模块,获得模块的类加载器,在运行时创建模块,扩展JDK service加载机制,使其成为一个能够识别模块,

6、能够提供对平台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提供了很多扩展的功能去严格控制
哪些包可以被导出(export)和导入(imported),所以你可以从你的 Jar文件里选择性的不包含一些资源(这样使用预打包的jar文件时将变得更为简单)

参考资料

Modularized Java with JBoss Modules

from: http://www.hollischuang.com/archives/854

使用JBoss Modules来模块化Java相关推荐

  1. JBoss模块示例–模块化Web应用程序

    最近,我读了为什么没有标准来开发真正的模块化Web应用程序? 由Patroklos Papapetrou撰写( 在Java Code Geeks中也有介绍 ). 受本文的启发,我决定检查实际使用的JB ...

  2. Hello World With JBoss Modules

    JBoss Modules是一个相当有趣的项目,他在Jboss应用服务器和Jboss生态系统项目中扮演者重要的角色.但是,网上关于Jboss Modules的东西却很少.甚至Jboss Modules ...

  3. 【Ovirt 笔记】JBoss modules 配置分析与整理

    文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅. 本文仅供学习交流使用,侵权必删. 不用于商业目的,转载请注 ...

  4. JBoss 系列八十五: JBoss Modules 简单介绍

    概述 从JBoss AS7开始,Classloader这块开始使用全新的JBoss Modules.本文简单介绍说明JBoss Modules的设计思路,以及给出一个例子说明这一设计思路. JBoss ...

  5. cxf springmvc_拥抱模块化Java平台:Java 10上的Apache CXF

    cxf springmvc 自Java 9发布最终将Project Jigsaw交付给大众以来,已经过去了整整一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答 ...

  6. JBoss Modules 模块描述文件解析

    jboss的module模块描述文件是一个XML文件,用来描述模块的结构,内容,依赖关系,过滤器,以及其它属性.它的格式是富有表现力的,用于使基于文件系统的模块装载器允许描述文件和模块内容放在一起,而 ...

  7. java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

    java cxf Java 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接. 总 ...

  8. 拥抱模块化Java平台:Java 10上的Apache CXF

    Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接. 总的来说, 拼图项 ...

  9. 模块化Java简介(转载infoq)

    在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来语言,比如Scala,也考虑了模块化的问 ...

最新文章

  1. “数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力
  2. java环境变量javac不能成功 win7_Java开发:Java环境搭建
  3. leetCode 两个数组的交集 II 问题记录
  4. bulkwrite 批量插入_SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
  5. git 多仓库源 配置
  6. linux修改文件句柄数生效_linux系统层面调优和常见的面试题
  7. Django REST framework 认证、权限和频率组件
  8. 计算机组成原理和体系结构----软考(到处copy)
  9. linux中的开机启动
  10. rocketmq java实战_RocketMQ实战与原理解析 杨开元著 PDF下载
  11. WinForm播放视频
  12. Python进阶(六)文件操作
  13. 【Linux】文件操作函数(系统调用函数)
  14. python辅助开发工具_Python开发工具:WingPro 7
  15. sql 触发器(Insert,update,delete)
  16. 安卓版kindle电子书位置_kindle 安卓 app下载的电子书放在什么文件夹?
  17. dell戴尔笔记本 F12没有usb;
  18. 爬虫I号 :获取免费代理服务器进行代理验证
  19. 深度学习中的depthwise convolution,pointwise convolution,SeparableConv2D深度可分离卷积
  20. 【Proteus仿真】【51单片机】水箱液位检测控制装置设计

热门文章

  1. 为什么大型科技公司更会发生人员流失 标准 ceo 软件 技术 图 阅读2479 原文:Why Good People Leave Large Tech Companies 作者:steve
  2. 大数据征信应用与启示 ——以美国互联网金融公司 ZestFinance为例
  3. 李开复:走向全球的两大路径,中美何以各占其一
  4. Apache Kafka-Spring Kafka将泛型反序列化为对象而非LinkedHashMap
  5. JVM - 列出JVM默认参数及运行时生效参数
  6. Java 8 - 06 Lambda 和方法引用实战
  7. 并发编程-21J.U.C组件拓展之Future和FutureTask
  8. Spring-注入参数详解-[集合类型属性]
  9. mysql连接优先级设置_MySQL的按优先级等效连接
  10. ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE