Java9发布已经有一年了,跟Java8相比,从目录对比就看得出来差别相当大。

实际上Java9最大的变化就是JDK模块化(Modular)。

那么,模块化的目的是什么呢?

官方的说法是:

之前版本的Java存在一些问题:

1、JDK和JRE作为一个整体部署,体积太大(JDK8只是rt.jar一个包就超过60MB)。体积大有如下缺点:

  (1)下载慢,部署慢。

  (2)内存较小的设备无法部署。这跟Java从诞生时的口号Write once , Run anywhere不符。

  (3)大量部署在云端,累计占用的内存非常可观。

2、访问控制粒度不够细。

  所有public关键字定义的属性或者方法,在任何地方都可以被调用,这影响了代码的封装性。例如在import了sun.*之后,sun.*下面大量用不着的API也暴露出来了(最直观的例子就是使用IDE时,在对象名后面输入点“.”自动会弹出所有public的属性和方法清单以供选择)。

  另外,之前的权限控制针对的是类与类之间的关系,模块化针对的是组件之间的控制。模块化的目标之一是,利用一组逻辑独立的组件搭建出完整的系统。  

3、Dependency Hell。

  依赖地狱是一个诙谐的说法,指的是由Java类加载机制的特性引发的一系列问题,包括JAR包冲突、运行时类缺失。

为了解决以上这些问题,Java9引入了模块系统JPMS。

  这里有个问题需要明确下,JPMS和OSGI的模块化还是有区别的,可以参考文章《Java 9,OSGi和模块化的未来》。


【说明】

1、JAR包冲突

  有时classpath中不同的JAR包会包含限定名完全相同的类。造成这种现象的原因有很多,例如一个Fat JAR包含了某个类A的版本v1,另一个Fat JAR包含了该类A的另一个版本v2,这时就会导致同一个类的两个版本冲突。
  JVM的类加载机制会从classpath中第一个包含某个类的JAR包里加载该类,这个被加载的类将会“屏蔽”该类的其他版本(可能真正需要的却是这个版本),使这些类变得不可用。这样会导致程序的行为不是我们预想的那样,结果可能很糟。

2、运行时类缺失(这是我自己的说法)

  有些依赖如第三方JAR包,Java运行时系统只有在真正需要访问这些JAR包时才能检测到它所依赖的某些类找不到。这时运行时系统将会抛出NoClassDefFoundError异常,进而导致正在运行的应用程序崩溃。

3、Fat JAR

Fat JAR是将所有依赖和资源文件都打包成一个JAR包,它可能包含了另一个它依赖的JAR包。

【参考】

https://www.jianshu.com/p/053a5ca89bbb

https://my.oschina.net/lt0314/blog/1544711

http://udn.yyuap.com/forum.php?mod=viewthread&tid=113385

https://stackoverflow.com/questions/373193/what-is-classpath-hell-and-is-was-it-really-a-problem-for-java

【JDK】JDK模块化(1)-为什么要模块化的更多相关文章

  1. JDK | JDK安装与环境变量配置

    文章目录 写在前面 官网下载安装jdk jdk系统环境变量的配置 检验jdk是否配置成功 写在前面 JDK的全称是Java SE Development Kit,也就是Java 开发工具箱.SE表示标 ...

  2. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。

    随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...

  3. SDK?JDK?JDK 下载、安装、配置图文教程

    什么是软件开发工具包(SDK)   开发一个软件,需要经过编辑.编译.调试.运行几个过程. 编辑:使用编程语言编写程序代码的过程. 编译:如上一节所讲,就是将编写的程序进行翻译. 调试:程序不可能一次 ...

  4. js模块化规范—概念和模块化进化史以及模块化的问题

    模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法 ...

  5. es6的模块化;js的模块化

    现在感觉Java.Python.Js都是越来越工程花,模块化.懂得每个模块的功能和使用场景,你很快的就能搭起一个功能齐备的应用.至于应用的性能.稳定性等,还在于你对模块的理解深度以及组合的成熟度,就看 ...

  6. JS 模块化 - 02 Common JS 模块化规范

    1 Common JS 介绍 Common JS 是模块化规范之一.每个文件都是一个作用域,文件里面定义的变量/函数都是私有的,对其他模块不可见.Common JS 规范在 Node 端和浏览器端有不 ...

  7. js模块化 javascript 模块化 闭包写法 闭包模块化写法

    var main = main || {}; ; (function (main) { 'use strict'; //私有变量 var _s1 = 'Hello '; var _s2 = 'Worl ...

  8. Mac上 intellij IDEA报错:Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk .jdk/Contents/Home/bin/java ( ) and /Library/Java/JavaVirtualMachines/jdk

    解决方案: 点击IDEA菜单里的Help-Edit Custom Properties,没有这个properties文件的话,会提示创建,在里面加上 idea.no.launcher=true 说明: ...

  9. JAVA模块化

    今天转载JAVA模块化系列的三篇文章. 在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来 ...

  10. 【转载】Java 9 新特性——模块化

    来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...

随机推荐

  1. Docker 扩容 容器空间大小 - 九

    Docker 扩容: 提前规划 : 一是从宿主机 配置磁盘格式 LVM 宿主机可以动态扩展: 二是 在容器上的扩容:默认是 100G .然后创建容器时候 挂载目录 或者直接池扩展: 默认 Docker ...

  2. easyui 进阶之tree的常见操作

    前言 easyui是一种基于jQuery的用户界面插件集合,它为创建现代化,互动,JavaScript应用程序,提供必要的功能,完美支持HTML5网页的完整框架,节省网页开发的时间和规模.非常的简单易 ...

  3. mui的switch开关的应用

    HTML: <!--mui的switch开关--> <div class="mui-content-padded"> <h5>switch开关m ...

  4. scrapy框架的每个模块的用途

    ## 一.scrapy框架的每个模块的用途 1.spiders: 自定义爬虫 定义允许爬取的范围 定义开始爬取的url parse:一定要重写 start_request:一般不需要重写,可以通过重写 ...

  5. if 语句

    if 判断条件的时候,如果是多个条件一起进行判断,那么就需要逻辑运算符   并且-----------and 或者-----------or 非(取反)----not   if 条件1 and 条件2 ...

  6. Liunx/RHEL6.5 Oracle11 安装记录[缺少依赖包的解决方案]

    1.将镜像文件挂,如/mnt # mount -o loop rhel-server-6.1-x86_64-dvd.iso /mnt#这一步其实有很多实现方法,如可以将镜像文件中的Packages文件 ...

  7. SpringCloud知识点20190313

    1.SpringBoot和SpringCloud的关系(面试题) Spring Boot 可以离开 Spring Cloud 单独使用开发项目,但是Spring Cloud离不开SpringBoot, ...

  8. SpringBoot--配置详解

    SpringBoot使用了一个全局的配置文件application.properties,放在src/mian/resource目录下或者类路径的/config下.springboot的全局配置文件的 ...

  9. python,类和对象(一)

    万物皆对象,在python中也存在对象,首先我们需要知道面向对象的三大特征封装.继承.多态. 封装就是将一种或多种杂乱无序的代码进行有序的分类封装. 继承可以理解为孩子会继承父亲所有的东西. 多态可以 ...

  10. tensorflow开发基本步骤

    Tensorflow开发的基本步骤: 定义Tensorflow输入节点 通过占位符定义: X = tf.placeholder("float") 2.通过字典类型定义: input ...