JAVA9模块化详解(一)——模块化的定义
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模块化详解(一)——模块化的定义的更多相关文章
- JAVA9模块化详解(二)——模块的使用
JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...
- 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)
详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类 Python中函数参数定义及调用函数时传参 ...
- 详解前端模块化工具-webpack
webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...
- ALSA声卡驱动中的DAPM详解之三:如何定义各种widget
上一节中,介绍了DAPM框架中几个重要的数据结构:snd_soc_dapm_widget,snd_soc_dapm_path,snd_soc_dapm_route.其中snd_soc_dapm_pat ...
- 详解JavaScript模块化开发
什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...
- javascript模块化详解
模块化:每个模块只完成一个独立的功能,然后提供该功能的接口.模块间通过接口访问.模块中的(过程和数据)对于其它模块来说是私有的(不能访问修改) 原始人写法: function m1(){ //... ...
- (转)详解JavaScript模块化开发
https://segmentfault.com/a/1190000000733959 什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来j ...
- C++中的指针(*)、引用(&)、const详解(一、定义变量)
一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...
- 小甲鱼PE详解之IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用(PE详解03)
咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! (视频教程:http://fishc.com/a/shipin/jiemixilie/) 接着我们来谈谈 IM ...
随机推荐
- HDU 1074 Doing Homework (状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- kettle介绍
Kettle也叫PDI,在2006年Kettle加入了开源的BI组织Pentaho,正式命名为PDI,英文全称为Pentaho Data Integeration.Kettle是"Kettl ...
- 利用quartz实现定时调度
1.Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.这里我介绍quartz的两种方式.我这里搭建 ...
- python 3 ---购物车练习
# -*- coding:utf-8 -*-#Author Chen #定义商品列表List_of_commodities = [ ('Iphone',6888), ('Mac Pro',12888) ...
- 开发环境MAPLAB下使用仿真器ICD2程序下载流程
程序下载流程 一. 连接示意图 二. 下载步骤 1.目标板电源断开 2.将仿真器下载端口与电路板JTAG端口有效连接 3.启动MPLAB软件 4.点击MAPLAB软件上方Programme ...
- Javascript判断数据类型与真假值隐形转换研究
一.引言 我们在开发的时候经常要判断真和假,这是我们经常写的代码: if(a){ alert(1) } 那我们怎么判定a是真还是假呢?下面这些值的真假又是多少呢?它们的数据类型又是怎样的呢? &quo ...
- 使用wwise音效引擎的好处
用过一段时间的wwise,做以下几个具体功能的时候比较方便: 1.当策划需求一个声音需要随机播放多个随机音源的其中一个时,例如脚步声.普通攻击声,当这类声音一直播放的都是同一个音源的时候,人会产生听觉 ...
- C#实现设置完整虚拟路径
){ mHttpUrl.Append(":"); mHttpUrl.Append(port);}string mServerName = "~/AppModu ...
- ionic基本环境的搭建
1.下载版本大于6的Node.js https://nodejs.org/en/ 个人喜欢下载最新版本 安装成功后可以用命令行工具输入node -v和npm -v分别查看node.npm版本 2.下载 ...
- UNIX标准及实现
UNIX标准及实现 引言 在UNIX编程环境和C程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用程序在不同的UNIX操作系统版本之间进行移植相当容易,但是20世纪80年代UNIX版本 ...