p1417 烹调方案_Java 8的烹调方式–拼图项目

p1417 烹调方案

什么是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

p1417 烹调方案

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

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

相关文章

jQuery progression 表单进度

progression.js是一款表单输入完成进度插件。支持自定义提示框大小、方向、左边、动画效果、间距等&#xff0c;也支持是否显示进度条、字体大小、颜色、背景色等。 在线实例 实例演示 使用方法 <form id"myform"> <p> <label>点击一个…

教学案例 计算机,宁夏计算机教学案例

宁夏计算机教学案例&#xff0c;答辩老师不仔细看**跟他们发现不了你**中的问题根本是两个概念。宁夏计算机教学案例&#xff0c; 生手指从未使用过计算机系统的学习者。他们不熟悉计算机的操作&#xff0c;缺乏有关计算机系统的知识。他们对计算机会产生一种陌生的感觉。新手指…

python读取多个文件夹图片_python或C++读取指定文件夹下的所有图片

本文实例为大家分享了python或C读取指定文件夹下的所有图片&#xff0c;供大家参考&#xff0c;具体内容如下1.python读取指定文件夹下的所有图片路径和图片文件名import cv2from os import walk,pathdef get_fileNames(rootdir):data[]prefix []for root, dirs, files in wal…

您在2016年会做什么? Apache Spark,Kafka,Drill等

让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险&#xff0c;尤其是有记录的预测&#xff0c;但是我很高兴您能在一年后回访&#xff0c;看看我对2016年的预测是如何完成的。 您在2016年会…

话筒好坏测试软件,如何简单地判断麦克风的质量好坏?

如何简单地判断麦克风的质量好坏&#xff1f;麦克风质量好不好&#xff0c;主要看三点&#xff1a;咪芯&#xff0c;线材和外壳。在挑选麦克风时&#xff0c;我们通常都不会一一上手试用&#xff0c;而是通过它自身的规格参数来进行初步地判断&#xff0c;一般来说&#xff0c;…

怎么保证读取最新数据_Kafka怎么保证数据不丢失?

Kafka怎么保证数据不丢失&#xff1f;这个问题要从3个方面来保证数据不丢失&#xff1a;生产者、服务端、消费者。01producer 生产端是如何保证数据不丢失的1.ack的配置策略acks all (或-1)生产者在发送消息之后&#xff0c;需要等待ISR中所有的副本都成功写入消息之后才能够收…

取模和求余的区别

通常情况下取模运算(mod)和求余(rem)运算被混为一谈&#xff0c;因为在大多数的编程语言里&#xff0c;都用%符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下%运算符的具体意义&#xff0c;因为在有负数存在的情况下&#xff0c;两者的结果是不一样的。对于整…

计算机转正述职报告ppt,转正述职报告ppt

转正要做述职演讲?出国留学网提供的新员工转正述职报告ppt就是为您量身定做的述职好帮手&#xff0c;希望大家喜欢!前三页预览&#xff1a;延伸阅读——如何做一个好的PPT演讲一个好的PPT演讲不是源于自然&#xff0c;有感而发。并且&#xff0c;一个好的PPT演讲需要演讲者的精…

怎么圆角变直角_衣柜设计个圆角有什么用?效果好看又实用,会这样装的都是老木工...

衣柜设计个圆角有什么用&#xff1f;效果好看又实用&#xff0c;会这样装的都是老木工随着生活水平的不断提高&#xff0c;大家对于生活质量也有着越来越高的期望。从生活起居以及房子的装修中&#xff0c;我们可以看出来。因此家里的东西堆积的也更加的多&#xff0c;这对于储…

不会吸引人的JavaDocs源样本

JavaDoc源代码嵌入很烂&#xff01; 我喜欢JavaDoc&#xff0c;但年龄不理想。 当您使用其他工具时&#xff08;例如在Microsoft世界中&#xff09;&#xff0c;突然间&#xff0c;嵌入式示例看起来很棒&#xff0c;并且“搜索”功能已内置&#xff01; 我们为什么不能拥有它…

浙大计算机硕士比本科985,二本出身的985研究生与985本科生,哪个更厉害?网友:差的太多!...

原标题&#xff1a;二本出身的985研究生与985本科生&#xff0c;哪个更厉害&#xff1f;网友&#xff1a;差的太多&#xff01;概率&#xff0c;还是概率问题。即便2本考研到985是很优秀&#xff0c;但能优秀到让985本科生服气的还是少数。说到底&#xff0c;是因为考研不是绝对…

cp: omitting directory解决方案

cp: omitting directory是因为目录下面还有目录。应该使用递归方法。需要加入-r参数。 及&#xff1a;cp -r 该目录名。转载于:https://www.cnblogs.com/zipon/p/6391153.html

python 网络服务器框架_Django是Python下的一款网络服务器框架

Django是Python下的一款网络服务器框架。Python下有许多款不同的框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。虽然Django之于Python&#xff0c;达不到Rail之于Ruby的一统江湖的地位&#xff0c;但Django无疑也是Python在网络应用方面的一位…

B系列台达服务器解密码步骤,台达HMI解密,DOP-A解密,DOP-B解密,文件密码解密

DOP-AS35THTD解密,DOP-AS38BSTD解密,DOP-AS57BSTD解密,DOP-A57BSTD解密,DOP-A57CSTD解密,DOP-A57GSTD解密,DOP-A80THTD1解密,DOP-A10TCTD解密,DOP-A10THTD1解密,DOP-AE57BSTD解密,DOP-AE57CSTD解密,DOP-AE57GSTD解密, DOP-AE80THTD解密,DOP-AE94BSTD解密,DOP-AE10THTD解密,DOP-…

Android View相关知识点

View 1,View坐标 Left,Right,Top,Bottom,表示view相对于父控件的距离值&#xff0c;是绝对值&#xff0c;绘制完之后就不会再改变的;X,Y表示view左上角相对于父控件的实时坐标值&#xff0c;是会随着移动view而改变的&#xff1b;TranslationX,TranslationY是view左上角相对于父…

5调用外部浏览器打开代码_浏览器事件循环

浏览器运行过程中会同时面对多种任务&#xff0c;用户交互事件(鼠标、键盘)、网络请求、页面渲染等。而这些任务不能是无序的&#xff0c;必须有个先来后到&#xff0c;浏览器内部需要一套预定的逻辑来有序处理这些任务&#xff0c;因此浏览器事件循环诞生了&#xff0c;再次强…

服务器生成文件怎么配置路径,npm run build生成的文件如何部署到服务器上

其实楼上两个人的回答都是对的&#xff0c;只不过侧重点不一样&#xff0c;一楼是大的方面说&#xff0c;配置好服务器就可以了&#xff0c;该怎么运行就怎么运行&#xff0c;只不过没有部署过项目的人可能就不知道怎么回事了&#xff1b;二楼说的应该是配置windos服务器的环境…

JVM上的高并发HTTP客户端

HTTP可能是最流行的应用程序级别协议&#xff0c;并且有许多库在网络I / O之上实现它&#xff0c;这是常规I / O的一种特殊&#xff08;面向流&#xff09;情况。 由于所有I / O都有很多共同点1 &#xff0c;所以让我们开始对其进行一些讨论。 我将集中讨论具有大量并发HTTP请…

linux下解析域名

linux下解析域名<?xml version"1.0" encoding"UTF-8"?> vi /etc/resolv.confnameserver 208.67.222.222 #opendnsnameserver 208.67.220.220sudo vim /etc/network/interfacesnull转载于:https://www.cnblogs.com/iceiceiceice/p/e64ca5a0b5941c7…

tomcat加白名单_超详细的tomcat管理页面各类型配置总结

概述大部分时候&#xff0c;我们的tomcat服务器都不是部署在本机&#xff0c;那么怎么样不通过ftp/sftp方式来将war包部署到tomcat容器呢&#xff1f;tomcat有提供web页面管理应用的功能。tomcat页面管理进入tomcat默认页面时有“server status”、“manager app”、“Host man…