哪些工具支持Java 9js模块化工具你都知道吗

【图文】java9新特性_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java9新特性
&&java9新特性归纳总结
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢关于Java 9,你应该知道的5件事_21CTO_传送门
关于Java 9,你应该知道的5件事
21世纪技术官导读:Java 9 现在已经发布几个月,我们来看看应该了解的五个高层次的技术点,如果你还没有用它,更应该关注一下。2017年9月,Java宣布发布最新版本的Java 9。它是在Java 8发布3年多以来的最新版本,它将一个更重要的 Java 交付给了开发者。Java 9是 Java 发布周期的重要转折点。 在本文中,我们将讨论Java 9中的给开发者的新功能。从操作角度来看,性能和安全性有所变化与增强。 我们将讨论Java 9中最令人兴奋的五个特性,以鼓励更多开发者采用 Java 9。模块化这是我们从Java 9 得来的最重要特性:Java平台开始系统模块化。Java最大的问题在于它的运行时库。 在一个大型平台上进行20年的开发会造成很大的问题甚至损失。许多类会冲突,相信你在大型代码库中所遇到的那样。 还有一点重要的是,没有办法在JDK中封装私有类,这导致了外部第三方库的激增,内部细节更复杂,这阻碍了Java平台的发展。使用Java 9后,JDK本身已经是模块化的,并配有90个独立的模块。一个模块将链接的数据包分组,其他模块只能访问从模块显式导出的软件包。最后,内部实现类可以实现真正封装。另外,模块可以设置对其它模块的显式依赖关系, 这些依赖关系在编译和执行期间由模块系统进行事先检查。模块也可用于模块化应用程序,而不仅仅是JDK本身。现在,你可以使用封装的包和显式的依赖关系来创建属于自己的模块,而不再使用脆弱的类路径。这些模块为更多结构化与可靠的应用提供了一条途径。 当然,Java模块系统不会在一夜之间改变Java环境。 模块系统将影响应用程序的设计,并在开发的所有阶段均需要使用,包括开发,编译,打包和运行。目前广泛采用模块系统之前还需要一段时间。 值得Java开发者高兴的是,许多应用程序都支持迁移场景,可逐步演变为模块化应用程序与库。生产率除了模块系统之外,Java 9还交付了提高开发人员生产力的小功能。比如,集合工厂方法允许你在单个语句中使用预定义元素创建不可变集合。不需要再用烦人的解决方法来创建小的预定义集合。另外一个主要的生产力加速器叫做 JShell,一个用于Java代码的Read-Eval-Print-Loop。可以交互式地输入和评估JShell中的Java代码片段,而不用再编译代码来测试运行。 探索性编程在您从REPL获得即时反馈时具有新的含义。JShel 已经与 IntelliJ IDEA 等主流IDE集成,允许开发者使用一个可以访问应用程序代码的交互式环境。性能运行新版本的Java 9,意味着你在不更改代码的情况下获得性能改进。在Java 9中,Compact Strings功能就是这种改进的一个例子,使用ASCII字符集完全表示的任何字符串将以每字符每字节方式存储。字符串在ASCII范围之外的字符串每个字符通常需要两个字节,大多数应用程序在运行中有大量的String对象,如果它们是简单的字符串,则可以大大减少内存使用量。Java 9中的另一个重要变化是,默认情况下将Garbage Collector G1(垃圾优先)作为垃圾收集器。它提供可调整的休眠时间与目标,并可以执行增量式收集。此更改的影响取决于你的应用程序的特性。通常来说,我们可以通过更少的GC休息来获得更低延迟的代码执行,而G1GC垃圾优先则使用稍高的CPU功率来实现这一点。在切换到Java 9时,测试此垃圾回收器在你的应用程序上的效果非常重要。在某些情况下,分配模式不一定适合G1GC方法,并且需要转移到另一个GC(或G1GC)。安全性开发人员的生产力特性远远不是采用Java 9的主要原因,Java 9平台 本身加入了众多新的增强安全性的功能。Java 9 的大多数安全增强功能都与安全联网有关。如TLS的最新版本现在支持HTTPS连接,并支持证书。另一个安全增强功能是过滤输入串行数据的功能。序列化一直是Java一直存在的问题,导致最近几年一直有一些安全漏洞。现在可以采用白名单或黑名单方法来过滤传入的序列化数据流,从而最大限度地减少Java序列化的攻击。发布周期到目前为止,我们已经关注了Java 9的技术特性,但Java 9 版本还有另一个重要原因,它标志着“功能驱动”的Java 时代结束。过去,选择了一些重要的功能,当它们开发好时就创建了一个新的Java版本发布。 实际上,上一个主要Java版本的发布开发者等了三年多的时间。 这在现在的环境下是不可接受的,所以 Oracle 和 OpenJDK 项目正在转向基于时间来发布新版本。现在,每6个月就会发布一个新版本的Java。它将包含当时准备好的所有功能。在这6个月的发布版本中,如有必要,可能会发布重要修复程序的更新。这个新的发布时间表有几个含义。首先,Java版本变得更加频繁和可预测,目前的更新计划是在每年的3月和9月发布。 新的版本号计划每六个月增加一次主要版本,这就是说,2018年3月发布 的下一个版本将是Java 10。目前版本名称的方案还在讨论中。对于许多公司团队来讲,每6个月更新一次的Java版本并不太具有吸引力。 因此,会在每三年指定一个长期版本(LTS),LTS的第一个版本将于2018年9月发布,这意味着Java 9 将不会支持长期版本。小结我们欣喜地看到,这些新的发布策略使Java比以往更加灵活。主要的功能分解为渐进式步骤,每6个月交付一次更新。 每次完成时都会发布功能,如果缺少一个版本,则在6个月内就会有另一个版本发布出来。即使在20年以后,Java 仍然会以令人兴奋和快捷的速度继续前行。作者:李刚来源:21世纪技术官社区
即将打开""小程序
觉得不错,分享给更多人看到
21CTO 微信二维码
分享这篇文章
21CTO 最新文章Java 9 因模块化进程缓慢而欲推迟发布
Oracle 欲推迟 Java 9 的发布,因为需要额外的时间来开发模块化功能和项目
,发布时间计划从 2016 年 9 月推迟到 2017 年 3 月。如果下周二 (12.8) 没有充分的反对意见,就会采用这个新提议。 Java 9 是标准 Java 平台非常重要的一个版本, ,而现在可能会被推迟 6 个月。在这周的一封 中,甲骨文的 Java 平台组首席架构师 Mark Reinhold 写道,计划推迟的原因主要是模块化开发的复杂性,这是为了,模块化开发基于 Jigsaw 项目。在之前的 18 个月 Jigsaw 的开发进程一直很顺畅,但是由于当前 JDK (Java
Development Kit) 9 特性完整里程碑是 12 月 10 日,Jigsaw 需要更多的时间来开发。“JSR 376 EG (专家组) 尚未发布初稿评审规范,但是在过去两个月收到了很多高质量的反馈和建议,而且还会继续有更多,所以 Java 开发组希望能确保基础构建工具和 IDEs 的维护者能有充足的时间来设计和实现模块化开发支持。”因此 Reinhold 提议 JDK 9 发布时间延长 6 个月,常规可用性推迟到 2017 年 3 月,特性完整里程碑推迟到 2016 年 6 月。根据之前的计划修改,这并不是要添加大量与 Jigsaw 无关的特性,也不是让现有特性无限制的增加。如果下周二没有充分的反对意见,12 月 8 日就会采用这个新提议。这不是 Jigsaw 第一次延迟了,此前在 Java 8 也发生过类似的事件。via &
Java 的详细介绍:
Java 的下载地址:
转载请注明:文章转载自 开源中国社区
本文标题:Java 9 因模块化进程缓慢而欲推迟发布
本文地址:
引用来自“Sel8616”的评论未来应该没java什么事了引用来自“TuWei”的评论大型系统及互联网需要引用来自“Sel8616”的评论这是现在的形势不是未来的又一个java黑
引用来自“挖红薯”的评论挺好的,我们有的项目还是1.5用过j4的泪奔,增强FOR循环报错...
引用来自“南湖船老大”的评论JDK9 就是解决这个问题的引用来自“Percy-Dreams”的评论理论这样 会把swing awt 等无关剥离开来吗? 引用来自“乔老爷”的评论主推javafx么?^O^ 引用来自“seno”的评论JavaFX 玩的还不错....哦,你主玩fx么?^O^
戳中要点了
引用来自“天下灯火”的评论发布新版本开发新特性叫瞎搞咩?引用来自“这个世界不真实”的评论 - -瞎搞是指的是 oracle 可能会干掉 sun.misc.unsafe.好多高性能 框架都在用这个。。例如 nettyopenjdk肯定删掉他。。sun的保留工具包早晚也得换掉,新的api速度也很快了。。不过向下兼容,一时半会不会变
引用来自“天下灯火”的评论发布新版本开发新特性叫瞎搞咩? - -瞎搞是指的是 oracle 可能会干掉 sun.misc.unsafe.好多高性能 框架都在用这个。。例如 netty
引用来自“南湖船老大”的评论JDK9 就是解决这个问题的引用来自“Percy-Dreams”的评论理论这样 会把swing awt 等无关剥离开来吗? 引用来自“乔老爷”的评论主推javafx么?^O^ JavaFX 玩的还不错....
引用来自“南湖船老大”的评论JDK9 就是解决这个问题的引用来自“Percy-Dreams”的评论理论这样 会把swing awt 等无关剥离开来吗? 主推javafx么?^O^
引用来自“java9”的评论谢谢你还没出生,不应该出来到处晃
发布新版本开发新特性叫瞎搞咩?
引用来自“南湖船老大”的评论JDK9 就是解决这个问题的引用来自“Percy-Dreams”的评论理论这样 会把swing awt 等无关剥离开来吗? 实际上jdk大不大,对于项目没有任何关系,对于性能也没有任何影响。。臃肿不臃肿的只是个安装包大小而已。不过jdk9会尽量解决这个问题
语法糖和新特性不是必不可少,现在基于jdk6的成功案例已经很多,高性能系统比比皆是,升级到7或者8已经能够有很大改善。新功能必须在大版本引入,小版本只能是性能改善和bug修复
引用来自“Sel8616”的评论未来应该没java什么事了java从6-8发展的速度已经很快了,一年半能出来一个什么语言大放异彩呢,已经几年的go现在什么样呢??楼上这种本身不开发java的,就别来玩业余爱好者的评论了。java9的模块化 是不使用import了么_百度知道
java9的模块化 是不使用import了么
我有更好的答案
就是导入所有util包下的你需要的不需要的类。如果有这种情况import java.util.a;import java.util.b;import java.util.c;正常你需要很多 个这个包下的类直接用import java.util.*;导入一个这个就行了,一个=3个不过一般来说不会用同包下的很多类
采纳率:72%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java 9 功能的新特性 (一)模块化 - 简书
java 9 功能的新特性 (一)模块化
Oracle 在 9月22 日终于发布了 jdk 9
(难产了好长时间啊%&_&%),java在走过了22个年头之后迎来了新的版本,作为一门使用率排在第一的编程语言(截止到现在10月份), What 's new ??
话不多说,让我们看一下这次发布带给我们的一个主要新功能——模块化。
Modularity(模块化)是第一个要介绍的,代码名称为Jigsaw。作为这次发布的重点功能,也是本文详细介绍的。其实在jdk 7的时候Oracle就考虑引入了,但是这中间考虑到稳定性、安全性等问题直到 jdk 9 才引入。
首先介绍一下模块化概念:
简单说模块是代码和数据的封装体。这里的代码指的是一些包含类型的Packages 。Packages是类路径名称,模块就是一个或者多个Package组成的封装体。
说完了概念,那么为什么Oracle要抛出这样一个概念呢?
改进组件间的依赖管理,引入比Jar粒度更大的Module
使得java SE程序更加容易轻量部署
改进性能和安全性
先说第二点如何理解,请看下面这张图:
运行一个简单的hello world程序,在JDK8中你需要几百兆的JRE环境,有些jar可能并不是你运行程序所必须的,浪费了很多空间。但是在 JDK 9中,JDK被分成了大约94个modules,在用的时候引入你需要的module就行了。
对于第一点如何理解呢?其实这点说的是解决 java 中 ““classpath hell”” 或者说“jar hell”的问题。看到这两个名词我也是一脸懵逼啊?!what the hell !
PS: ““classpath hell”” 和“jar hell”在本质上相同,只是后者更加关注由复杂类加载层级产生的问题。
JAR Hell 问题源自java中的类加载机制。它主要表现出四个问题:
1、无法表述的依赖关系(Unexpressed Dependencies)和传递依赖(Transitive Dependencies)
首先一个 jar 包是不能通过某种方式去告诉JVM 我依赖哪些其他 jar包的。 需要开发者自己通过读文档,判断依赖关系,下载缺失的依赖jar包。而且只有在运行时需要用到依赖jar包时,才会报 NoClassDefFoundError的错误。传递依赖指的是应用程序需要依赖一些库,而这些库又会依赖其他一些库,像这样依赖传递下去,使得依赖关系呈现指数级复杂关系,很容易出错。
2、遮蔽(Shadowing)
不同的jar包在类路径上的类有完全相同的名字。这种现象比较常见,原因有很多,比如相同库中有两个不同版本,库被重命名并添加到类路径中两次。
由于类在第一个包含他们的JAR包中就已经被加载,类中的变量会“shadow” 所有其他变量,使得他们不能在用了。
是不是说的比较晦涩?show me the code!!!
public class Base {
String name = "Base";
String getName() { }
public class Sub extends Base {
public String name = "Sub";
public String getName() { }
下面程序输出的是“Sub”, 子类shadow 父类的变量,是不是立马理解了?
class Program {
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.name); //Output "Sub"
3、版本冲突(Version Conflicts)
当两个库依赖的的第三方库是不同并且不兼容的时候就会出现版本问题。如果两个版本同时出现在类路径中,会出现不可预知的结果。首先因为“shadowing”,在这两个版本中存在的类只会加载一个。更糟糕的是,如果一个类存在于一个库而不在另一个中,这个类被访问的时候也会被加载进来,调用库的代码会发现两个版本混在一起。但是不兼容版本是必须的,缺少一个程序就无法正常运行,比如抛出NoClassDefFoundErrors。
4、复杂的类加载(Complex Class Loading)
默认情况下所有程序类都是被相同的类加载器加载的,但是开发人员可以自己定义类加载器。类加载通常对开发者来说是不可见的,由容器比如web服务、组件系统来完成,但是
。开发人员在某些情况下得自己显示地加载类,这些自定义的类加载器会导致复杂的不可预知的行为。(原谅我直接这句话直接翻译了%&_&%)。
那么Module是如何处理上述四个问题的呢?
首先看一下JDK 9如何定义一个module:
模块的是通过module-info.java进行定义,编译后打包后,就成为一个模块的实体;在模块的定义文件中,我们需要指定模块之间的依赖靠关系,可以exports给那些模块用,需要使用那些模块(requires) 。下面是一个例子:
module com.foo.bar {
requires org.baz.
exports com.foo.bar.
exports com.foo.bar.
1、对于第一个问题,先看下图,左边是定义module的代码,app需要zoop和sql,右边是依赖关系。
JVM会通过了 去解析所有的依赖,类似下面的图
,这个过程发生在启动阶段,而不是运行阶段。当不是所有的modules在这条路径上被发现时,解析一个module传递依赖的过程就失败了。这就解决了无法描述和无限传递依赖的问题。
2、第二问题。模块系统只要发现两个模块输出相同的包给同一个模块就会报错。如下图所示。
3、版本冲突问题,最直接的解决方式是模块系统能加载相同模块的不同版本,并且保证这些版本不会互相影响,保证封装性和可读性。但是抱歉,版本冲突问题目前没有办法解决。原因摘自官网:
It is not necessary to support more than one version of a module within a single configuration.
事实上,现在的Maven和Gradle也没法理解module的版本信息。
4、最后是复杂的类加载问题,先说结果:Module并没有彻彻底底解决该问题,但是简化了问题复杂性。
Oracle引入了层(Layer)的概念。(一个module够烦的,还抛出个layer概念,发现很多互联网公司都喜欢抛个新概念出来强行装逼啊!!!!!TMD)。layer控制模块和类加载器之间的关系。使得在同一个layer里的不同模块都使用相同的类加载器。换句话说类加载器和模块之间是1:n的关系。同时Layer还有堆叠的特点,如下图所示。
一个新layer可以在boot layer上构建,另外的layer也能在这个layer上构建。在解析某个layer里的module时候可以读取里面的modules或者在它下面的layer里的module。
说白了,我的个人理解,layer就是让一个类加载器去专门负责某个module下的所有类加载,有什么好处,我也不知道啊?各位能不能写个列子出来???
讲了模块化的好处,似乎还是比较抽象,下面两张图比较直观展示模块化之后的好处:
下是 jdk 8中包的依赖关系
是不是很复杂呢?
JAVA 9 引入模块后,将所有的类组织成模块形式,模块之间有着优美的依赖关系
再看JDK9 简化后的关系图
最后的问题
以下是Jigsaw官网的原话:
Make it easier for developers to construct and maintain libraries and large applications, for both the Java SE and EE Platforms.
是不是让你联想到了Maven 和 Gradle? 他们之间到底是什么关系啊??
Google 一下在上找到了答案。
在Jigsaw之后,public 关键字不再意味着任意的可访问性。访问的范围局限在JAR,想要访问 JAR包外的其他类,必须export。 任何模块之间的交互必须通过module-info文件来定义。
举个列子,生成的WAR包可能并没改变源代码,但是在其中的所有JAR必须定义module-info。
Maven 有两个主要的特征。他负责项目的依赖管理和构建。依赖管理的意思是Maven可以决定库中的版本并从仓库中下载下来。构建的意思是Maven可以编译代码并且打包成产品。
Module是系统内置用于表述组件之间的关系,对于版本的管理还是处于最原始的状体。它管理一种强制的依赖关系。
总结一下:Maven还是组要负责构建,包括开发过程中的各种任务,初始化,测试。但是要利用Jigsaw, Maven必须知道如何通过Jigsaw模块编译打包。Modules 对于像Maven这样的构建工具(build tools)来说扮演的是辅助补充的角色。因为这些构建工具在构建时建立的依赖关系图谱和他们版本可以根据Module来创建,Module强制确定了module和artifacts之间的依赖关系,而Maven对于依赖并非是强制的。
本文主要参考了一下两个国外文献,一篇CSDN上的博客,以及oracle官方的视频讲解,youtube上有的(别问我怎么翻墙)
感谢阅读,这是我第一次在简书上写文章,以后会多写一些,有问题欢迎讨论,最后祝大家节日快乐!!
一寸山河一寸血,十万青年十万军
文 by / 林本托 Tips做一个终身学习的人。 在此章节中,主要介绍以下内容: 在JDK 9之前Java源代码用于编写,打包和部署的方式以及该方法的潜在问题 JDK 9中有哪些模块 如何声明模块及其依赖关系 如何封装模块 什么是模块路径 什么是可观察的模块 如何打印可观...
文 by / 林本托 Tips做一个终身学习的人。 在此章节中,主要学习以下内容: 如何声明模块依赖 模块的隐式可读性意味着什么以及如何声明它 限定导出(exports)与非限定导出之间的差异 声明模块的运行时可选依赖关系 如何打开整个模块或其选定的软件包进行深层反射 JD...
Tips做一个终身学习的人。 十四.
使用模块层 使用模块层是一个高级主题。 典型的Java开发人员不需要直接使用模块层。 现有的应用程序不会使用模块层。 如果将应用程序迁移到JDK 9或使用JDK 9开发新的应用程序,无论是否需要,都至少使用一个由JVM在启动时创建的模...
Tips做一个终身学习的人。 在这章节中, 主要介绍以下内容: 封装Java模块的不同格式 JAR格式增强 什么是多版本JAR 如何创建和使用多版本JAR JMOD是什么格式 如何使用jmod工具来处理JMOD文件 如何创建、解压和描述JMOD文件 如何列出JMOD文件的内...
Tips做一个终身学习的人。 在本章节中,主要介绍以下内容: 什么是模块 API 如何在程序中表示模块和模块描述 如何读取程序中的模块描述 如何表示模块的版本 如何使用Module和ModuleDescriptor类读取模块的属性 如何使用Module类在运行时更新模块的定...
看着一排排书架上的书,随意挑出一本,之后随意的翻翻,然后快速放回去。再取下一本,同样就那么翻翻,而后放回去。但其中哪怕一句也未曾看清。 今天是世界读书日,可于我,有些心烦气躁的,并不是个能够静下心来看书的好日子。 忽的,手停在半空,一个念头挤入我的脑中。我,也是个自誉为爱写...
一直以来都很喜欢文字,但大部分的灵感都只存在于一瞬间,仅仅就停留在一种感觉上,却从未真正记录下来。长此以往,喜欢的消遣便成了奢望。想从此篇开始,记录自己的所有灵感,让文字能流于心灵。 私语,是最近所读张爱玲的一篇散文的名字,都是些很琐碎的点滴,却很偏爱这种轻声细语的诉说方式...
带孩子去张家界玩了三天,亲子共读记录也断了几天。倒不是没时间写,而是到了酒店孩子就拿我手机听西游记,手机代替牛听听。张家界正是86版西游记的取景点之一,算是应景。只是86版的西游记还没有给她看她还无法联系起来。我最不会写的大概就是游记。记录她的几件趣事。 第一天看着干净的街...
每天都有人在重新开始, 我觉得今天是个好日子, 所以就从今天开始吧, 读书,运动,尝试, 一切听起来都很美好。}

我要回帖

更多关于 前端模块化管理工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信