JAVA9模块化详解

前言

java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性——模块化。模块化系统的主要目的如下:

  • 更可靠的配置,通过制定明确的类的依赖关系代替以前那种易错的类路径(class-path)加载机制。
  • 强大的封装,允许一个组件声明它的公有类型(public)中,哪些可以被其他组件访问,哪些不可以。

这些特性将有益于应用的开发者、类库的开发者和java se平台直接的或者间接地实现者。它可以使系统更加健壮,并且可以提高他们的性能。

一、定义模块化

  为了提高可靠的配置性和强大的封装性,我们将模块化看作是java程序组件的一个基本的新特性,这样它对开发者和可支持的工具更加友好。一个模块是一个被命名的,代码和数据的自描述的集合。它的代码有一系列包含类型的包组成,例如:java的类和接口。它的数据包括资源文件(resources)和一些其他的静态信息。

1.1 模块的声明

  一个模块的自描述表现在它的模块声明中,它是java程序语言中的一个新的结构,最简单的可能的模块声明仅仅是指定模块的名字

module com.foo.bar { }

  一个或更多个requires项可以被添加到其中,它通过名字声明了这个模块依赖的一些其他模块,在编译期和运行期都依赖的。

module com.foo.bar {
requires org.baz.qux;
}

  最后,exports项可以被添加,它可以仅仅使指定包(package)中的公共类型可以被其他的模块使用。

module com.foo.bar {
requires org.baz.qux;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}

  如果一个模块的声明中没有exports项,则它根本不向其他模块输出任何的类型。

  按照约定,模块声明的源代码被放在了模块源文件结构的根目录,文件的名字叫module-info.java。例如:模块com.foo.bar包含的文件如下:

    

  按照约定,模块声明被编译到module-info.class文件中,并输出到类文件的输出目录。

  模块的名字,像包的名字一样,必须不能重复。命名模块的推荐方式是使用反转域名的方式,它长期被推荐使用到包的命名。模块的名字经常是它的输出包的前缀,但是这个关系也不是强制的。模块的声明既不包括版本号,也不包括它依赖模块的版本号。这是有意这样的:解决版本选择问题不是模块化系统的目的,这个问题最好留个构建工具和容器应用。

  模块声明是java程序语言的一部分,而不是他们自己的一个语言或标记,有几个原因:其中最重要的一个原因是模块的信息在编译期和运行期都可用,确保在编译期和运行期以相同的方式运行。这样可以防止很多种错误,至少在编译期提前报告,并且可以更早的诊断和修复。

  在一个源文件中表达模块声明,它可以连同模块中的其他文件一起编译,编译成的类文件可以被java虚拟机消费。这种方式对于开发者来说非常熟悉,IDE和构建工具也不难支持。

1.2 模块的零件

  存在的工具已经可以创建,处理,消费jar文件,为了采用和迁移简单,我们定义了模块jar文件。一个模块jar文件非常像一个普通的jar文件,除了在根目录包含了一个module-info.class。例如上面的com.foo.bar模块jar文件包含以下的内容:

  

  模块jar文件可以作为模块使用,在这种情况下,module-info.class包含了模块的声明它可以放在普通的类路径下,这种情况下,module-info.class将被忽略。模块jar文件允许类库的维护者装载一个单一的零件,它可以作为一个模块工作(在java9以后)也可以作为一个普通的jar文件工作。我们希望java9的实践者提升jar工具,使得它更容易的生成模块jar文件。

  为了模块化java平台的相关实现,我们介绍了一个新的零件格式,它超越了jar文件,容纳了本地代码、配置文件、和其他的不能自适应的数据类型。这种格式促使模块声明表达式的另外一个优点,把它们编译到class文件中,这个class文件是独立的,这种新的格式,暂时命名为“JMOD”,它被标准化是一个公开的议题。

1.3 模块描述

  编译模块声明到一个类文件的优点是这个类文件有了一个精确定义和可扩展的格式,我们认为module-info.class,它包含了代码级别的编译模式,里边插入的其他变量在初始化时也会被编译。

  一个IDE或者打包工具可以插入一些包含标记信息的变量,例如:模块的版本、标题、描述、和许可等。这些信息在编译期和运行期都会被模块系统映射成可使用的信息。它也可以被下游工具构建时使用。指定的变量的集合将被标准化,但是其他的工具和框架也可以定义额外的需要的变量。没有标准化的变量在模块系统中是没有效果的。

1.4 平台模块

  java9将使用模块化系统将平台分割成若干个子模块。java9平台的实现者可以包含其中的所有模块,也可以是其中的一些。

  模块系统中明确知道的模块是基础模块,它被命名为java.base。基础模块定义和输出所有平台的核心包,包括模块系统本身:

  

module java.base {
exports java.io;
exports java.lang;
exports java.lang.annotation;
exports java.lang.invoke;
exports java.lang.module;
exports java.lang.ref;
exports java.lang.reflect;
exports java.math;
exports java.net;
...
}

  基础模块总是实时的,其他的每一个模块都隐式的依赖基础模块。其他的平台模块将通过“java.”的前缀分享,例如:java.sql的数据库连接,java.xml处理xml文件,java.log处理日志,java9没有定义的,将会通过“jdk.”的前缀分享出来。

  至此,java9的模块化先定义到这里,翻译的不好,大家见谅,稍后会继续介绍java模块化的使用。

JAVA9模块化详解(一)——模块化的定义的更多相关文章

  1. JAVA9模块化详解(二)——模块的使用

    JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...

  2. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  3. 详解前端模块化工具-webpack

    webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...

  4. ALSA声卡驱动中的DAPM详解之三:如何定义各种widget

    上一节中,介绍了DAPM框架中几个重要的数据结构:snd_soc_dapm_widget,snd_soc_dapm_path,snd_soc_dapm_route.其中snd_soc_dapm_pat ...

  5. 详解JavaScript模块化开发

    什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...

  6. javascript模块化详解

    模块化:每个模块只完成一个独立的功能,然后提供该功能的接口.模块间通过接口访问.模块中的(过程和数据)对于其它模块来说是私有的(不能访问修改) 原始人写法: function m1(){ //... ...

  7. (转)详解JavaScript模块化开发

    https://segmentfault.com/a/1190000000733959 什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来j ...

  8. C++中的指针(*)、引用(&)、const详解(一、定义变量)

    一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...

  9. 小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)

    咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! (视频教程:http://fishc.com/a/shipin/jiemixilie/) 接着我们来谈谈 IM ...

随机推荐

  1. Holding Bin-Laden Captive!(1.多重背包 2.母函数)

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  2. 暑假练习赛 007 E - Pairs

    E - Pairs Description standard input/outputStatements In the secret book of ACM, it’s said: “Glory f ...

  3. 暑假练习赛 007 B - Weird Cryptography

    Weird Cryptography Description standard input/outputStatements Khaled was sitting in the garden unde ...

  4. PHP小技巧

    1.js获取服务器年月日 var date= '<?php echo date("Y-m-d",time())?>';//获取服务器年月

  5. 使用python3的typing模块提高代码健壮性

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

  6. [深度学习]实现一个博弈型的AI,从五子棋开始(2)

    嗯,今天接着来搞五子棋,从五子棋开始给小伙伴们聊AI. 昨天晚上我们已经实现了一个五子棋的逻辑部分,其实讲道理,有个规则在,可以开始搞AI了,但是考虑到不够直观,我们还是顺带先把五子棋的UI也先搞出来 ...

  7. c#读取Excel数据到Gridview

    #region 读取Excel数据到Gridview public void ReadExcel(string sExcelFile, GridView dgBom)    { DataTable E ...

  8. 堆排序HeapSort

    堆排序,顾名思义,是采用数据结构堆来进行排序的一种排序算法. 研究没有规律的堆,没有任何意义.特殊的堆有最大堆(父节点值大于等于左右字节点值),最小堆(父节点值小于等于子节点值).一般采用最大堆来进行 ...

  9. pt-tcp-model

    http://blog.9minutesnooze.com/analyzing-http-traffic-tcpdump-perconas-pttcpmodel/ #获取200k个packets tc ...

  10. vue 项目中实用的小技巧

    # 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...