Java 8的烹调方式–拼图项目

什么是Project Jigsaw:Project Jigsaw是使Java编译器模块知道的项目。 多年以来,Java API一直是整体的,即从代码的任何部分都可以平等地看到整个API。 还没有任何方法可以声明代码对任何其他用户库的依赖关系。 拼图项目试图以非常有效的方式来解决这些问题。 在本文中,我将重点介绍Jigsaw模块系统的基本概念,并解释其如何与命令一起使用,以提供真实的感觉。 目前,Jigsaw的目标是包含在Java 8的发行版中。我认为,这比Java平台第5版随附的泛型有很大的变化。

Project Jigsaw实现了什么:正如我之前解释的,Jigsaw项目解决了整个Java API用作单个整体代码库的问题。 以下几点突出了主要优点。

1.依赖关系图 :Jigsaw提供了一种方法,可以唯一地标识特定的代码库,还可以声明代码库对其他代码库的依赖关系。 这将为一组特定的类创建一个完整的依赖图。 例如,您要编写一个依赖于Apache BCEL库的程序。 到目前为止,您还没有办法在代码本身中表达此要求。 使用Jigsaw,您可以在代码本身中表达此要求,从而允许工具解决此依赖性。

2.同一代码的多个版本 :假设您编写了一个同时依赖libray A和库B的程序。现在假设库A依赖于库C的版本1.0,库B依赖于库C的版本2.0。在当前的Java中在运行时,如果不创建自定义类加载器的复杂层次结构,就无法同时使用库A和B,即使这在所有情况下都行不通。 在Jigsaw成为Java的一部分之后,这就不成问题了,因为一个类将只能看到其依赖类的版本,这些依赖类是类容器模块所需的模块版本的一部分。 也就是说,由于模块A依赖于模块C的版本1.0,而模块B依赖于模块C的版本2.0,因此Java运行时可以确定模块A或模块可以看到模块C中的类的哪个版本。 B.这类似于OSGi项目。

3. Java平台本身的模块化 :当前的Java平台API庞大,并非每种情况下它的所有部分都相关。 例如,旨在运行Java EE服务器的Java平台不必实现Swing API,因为这没有任何意义。 同样,嵌入式环境可以精简一些不太重要的API(对于嵌入式),例如编译器API,以使其更小,更快。 在当前的Java平台下,这是不可能的,因为任何经过认证的Java平台都必须实现所有API。 拼图将提供一种仅实现与​​特定平台相关的API集的一部分的方法。 由于模块可以显式声明其对任何特定Java API模块的依赖关系,因此只有在平台具有该模块所要求的模块的实现时,该模块才会运行。

4.与OS本机安装集成 :由于模块系统与现代操作系统中当前可用于安装程序和库的模块系统非常相似,因此可以将Java模块与这些系统集成。 这些实际上不在Jigsaw项目本身的范围内,但鼓励OS供应商启用它,并且他们很可能会这样做。 例如,可以轻松地增强基于Redhat的linux系统中可用的基于rpm的存储库系统和基于Debian的linux系统中可用的基于apt的存储库系统,以支持java模块系统。

5.模块入口点 :Java模块可以指定入口点类,就像jars可以指定它一样。 运行模块时,将调用入口点的main方法。 现在,由于操作系统现在可以安装Java模块并且可以执行Java模块,因此它与安装操作系统的本机程序非常相似。

5.效率 :目前,每次运行JVM时,它都会验证程序运行期间加载的每个单个类的完整性。 这需要花费大量时间。 此外,还可以从OS文件系统单独访问类。 由于可以在运行之前安装模块,因此安装本身现在可以包含验证步骤,从而无需在运行时验证类。 这将导致相当大的性能改进。 而且,模块系统可以以其自己的优化方式存储类,从而进一步提高性能。

6.模块抽象 :可以为特定模块提供抽象。 说模块A依赖于模块X。现在,模块D可以提供模块X,从而提供其实现。 例如,Apache Xerces模块将要提供jdk.jaxp模块,并且能够满足jdk.jaxp的依赖关系要求。

模块化代码库的基础:上面的所有讨论都非常模糊,没有模块化代码库及其用法的真实示例。 模块化代码库可以是单个模块或多个模块。 对于单个模块,我们需要启用模块是在任何包外部的源路径的基础上创建一个名为module-info.java的文件。 module-info.java文件是以特殊语法编写的特殊Java文件,旨在声明模块信息。 以下是此类mdoule-info.java的示例。

module com.a @ 1.0{requires com.b @ 1.0;class com.a.Hello;
}

在这种情况下,该模块名为com.a,并且它对com.b有依赖性。 它还声明了一个入口点com.a.Hello。 请注意,虽然这可能是最佳做法,但并不要求程序包结构必须在模块名后加上模块名。

现在您可能会想,如果它是单个模块模式,那么为什么要依赖于另一个模块,却不能使它成为两个模块。 请注意,即使只有一个显式声明依赖模块,对所有Java API模块也存在隐式依赖。 如果没有将Java API模块明确声明为依赖项,则将全部包含。 它仍然是单个模块的唯一原因是com.b必须在模块库中以二进制形式可用。 同时编译多个模块时的多模块。 在单个模块中编译源代码就像我们编译非模块化源代码一样简单。 唯一的区别是module-info.java将出现在源根目录中。

多模块源:如果源包含多个模块,则必须为它们提供目录结构。 它非常简单。 特定模块下的源必须保存在模块名称的目录中。 例如,模块com.a中com.a.Hello类的源必须保存在[source-root] /com.a/com/a/Hello.java中,而模块-info.java必须保留在目录[source-root] /com.a中

编译多模块源:为此,让我们考虑一个编译两个模块com.a和com.b的示例。 让我们首先看一下目录结构。 如下:

classes
src|--com.a|  |--module-info.java|  |--com|     |--a|        |--Hello.java|--com.b|--module-info.java|--com|--b|--Printer.java

com.a中module-info.java的代码将像这样。

module com.a @ 1.0{requires com.b @ 1.0;class com.a.Hello;
}

com.b中的module-info.java

module com.b @ 1.0{exports com.b;
}

com.b / com / b中的Printer.java

package com.b;public class Printer{public static void print(String toPrint){System.out.println(toPrint);}
}

com.a / com / a中的Hello.java

package com.a;
import com.b.Printer;public class Hello{public static void main(String [] args){Printer.print("Hello World!");}
}

这些代码很容易解释,我们尝试使用模块com.a中com.a.Hello类中的模块com.b中的com.b.Printer类。 为此,com.a module-info.java必须使用Requires关键字将com.b声明为依赖项。 我们正在尝试在classes目录中创建输出类文件。 下面的javac命令可以做到这一点。

javac -d classes -modulepath classes -sourcepath src `find src -name '*.java'`

请注意,我们在backquotes(`)中使用了find命令,以便该命令的输出将包含在文件列表中。 这将在linux和unix环境中工作。 在其他情况下,我们可以简单地输入文件列表。

编译后,classes目录将具有类似的类结构。 现在,我们可以使用jmod命令安装模块。

jmod create -L mlib
jmod install -L mlib classes com.b
jmod install -L mlib classes com.a

我们首先创建了一个模块库mlib,并将模块安装在该库中。 通过在jmod中不为install命令指定-L选项,我们也可以使用默认库。

现在我们可以简单地使用以下命令运行模块com.a

java -L mlib -m com.a

在这里我们也可以使用默认模块。 还可以创建可直接安装的可分发模块软件包(相当于今天的分发机制中的jar)。 例如,以下将为com.a创建com.a@1.0.jmod

jpkg -m classes/com.a jmod com.a

我试图在即将发布的Java版本中概述模块基础结构。 但是项目Jigsaw每天都在进行修改,并且最终可能完全不同。 但是,预计基本概念将保持不变。 整个模块的概念更加复杂,我将在下一篇文章中详细介绍。

参考: Java 8中的烹饪方法–来自JCG合作伙伴 Debasish Ray Chawdhuri的Jigsaw项目 ,位于Geeky Articles博客上。


翻译自: https://www.javacodegeeks.com/2012/05/whats-cooking-in-java-8-project-jigsaw.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之路-SQLAlchemy

SQLAchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装: pip3 inst…

POJ 1751 Highways

题意:n个城市,然后把n个城市的坐标都给你,然后给你m条已经修好的道路,然后给出m个已经修好道路的城市a,b, However, they want to guarantee that every town is highway-reachable from every other town.…

C语言编程中void什么意思,程序设计中遇到的void到底是什么意思

部分编程的初学者都会问"void是什么意思","为什么很多函数前都要加个void".实际上,void最简单的解释就是把0转换成空类型的意思。下面用各个开发语言来详解void1.C语言中的void表示空类型,它跟int,float是同地位的,一般用…

Linux中vim编辑器的缩进的功能键

vim编程时,经常需要对代码进行缩进处理,以增加程序的可读性和后期的代码维护. 可以采用多种方式达到缩进的目的: 1) 命令模式(command mode) 2) Visual模式(visual mode) 2) 输入模式(entry mode) 3) 末行模式(last-line mode) 4) 在/etc/vimrc有给予vim…

JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目

本文展示了如何集成JSF2,PrimeFaces3,Spring3和Hibernate4技术。 它为Java开发人员提供了一个通用的项目模板。 另外,如果Spring不用于业务和数据访问层,则可以提供JSF – PrimeFaces和Hibernate集成项目。 二手技术&#xff1a…

c语言编程文件中删除数据结构,C语言数据结构实战(一)顺序表的插入与删除

今天学习了思成老师的数据结构实战教程 写了一个顺序表 插入和删除的操作 把源码共享给大家 一共包括list.c stu.h main.c list.h .h文件是头文件 需要引入 具体的功能我都已经在代码中写明了list.h代码如下://线性表的定义在头文件中实现#ifndef _LIST_H#define …

内存使用分析工具Valgrind简单用法

转载自 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 暂时还未使用过,记录下,记录下,记录下 Valgrind的主要作者Julian Seward刚获得了今年的Google-OReilly开源大奖之一──Best Tool Maker。让我们一起来看一下他的作品…

Lucene概述第一部分:创建索引

介绍 我最近一直在与开源搜索引擎Lucene合作 。 我不是专家,但是由于我只是浏览了一些相当稀疏的文档并将应用程序从Lucene的很旧的版本迁移到了最新版本的2.4,所以我在总体上很清楚。 Lucene的文档有点让人难以想象,因此我想趁此机会在我脑海…

初识openstack

一、 什么是openstack? OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 二、openstack前世今身 openstack是一个跟Eucalyptus,AWS(Amazon web Service)类…

c语言case多语句的取值,Switch Case语句中多个值匹配同一个代码块的写法

C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的e…

php解决下单、抽奖并发导致的库存负数的问题

我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的: sql1:查询商品库存 if(库存数量 > 0) { //生成订单... sql2:库存-1 } 当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而…

在Spring中使用JDBCJobStore配置Quartz

我将开始一些有关Quartz Scheduler内部,提示和技巧的系列文章,这是第0章-如何配置持久性作业存储。 在Quartz中,您基本上可以在将作业和触发器存储在内存中以及在关系数据库中进行选择( Terracotta是最近添加的混合功能&#xff0…

rlwrap插件,实现sqlplus上下翻页

oracle在Linux下,sqlplus中不能上下翻,最主要我经常打错字!嘿嘿 01、下载 RPM :http://rpmfind.net/linux/rpm2html/search.php?queryrlwrap tar.gz:https://fossies.org/linux/privat/rlwrap-0.42.tar.gz/ 百度云:h…

ice库c语言例子,很不多的ICE架构入门学习例子

虽然使用传统的SOCKET编程,我们可以更为清楚程序的性能,能够更直接的操控SOCKET的设置,比如发送超时时间,接受BUFFER的大小,以及进行自己的协议加密。但是由于其调试成本较高,且不易于分布式部署ICE 作为一…

程序员的十个层次,你属于哪一层?(转)

自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差&…

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构(硬件系统) 操作系统的定义:操作系统是掌控计算机上所有事情的软件系统(硬件资源,软件资源) 操作系统对内存,i/o,cpu&#x…

高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

...快速中值滤波及c语言实现学生姓名: 刘 勇 学 号: 6100410218 专业班级: 数媒101【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题.解…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian ,其屡获殊荣的建在Java虚拟机(JVM)运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…

Jquery选择器特殊字符问题

场景: $("#" AAA ""),AAA代表某表单ID 当AAA为普通字符串时,ok; 当AAA含有特殊符号时(eg:a.b),获取不到该对象; 原因:特殊符号会进行转义&#xf…

qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用

九、 智能调频、空码检索、词序固定在QQ五笔中还有一些小亮点,比如它可以根据“最近输入”、“输入次数”对候选词排序。同时为了加快检索速度,默认只在常用字库(GB2312)中检索,只有出现空码后才会继续搜索容量更大的GBK字库,很好…