【JDK】JDK模块化(1)-为什么要模块化
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)-为什么要模块化的更多相关文章
- JDK | JDK安装与环境变量配置
文章目录 写在前面 官网下载安装jdk jdk系统环境变量的配置 检验jdk是否配置成功 写在前面 JDK的全称是Java SE Development Kit,也就是Java 开发工具箱.SE表示标 ...
- Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。
随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...
- SDK?JDK?JDK 下载、安装、配置图文教程
什么是软件开发工具包(SDK) 开发一个软件,需要经过编辑.编译.调试.运行几个过程. 编辑:使用编程语言编写程序代码的过程. 编译:如上一节所讲,就是将编写的程序进行翻译. 调试:程序不可能一次 ...
- js模块化规范—概念和模块化进化史以及模块化的问题
模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法 ...
- es6的模块化;js的模块化
现在感觉Java.Python.Js都是越来越工程花,模块化.懂得每个模块的功能和使用场景,你很快的就能搭起一个功能齐备的应用.至于应用的性能.稳定性等,还在于你对模块的理解深度以及组合的成熟度,就看 ...
- JS 模块化 - 02 Common JS 模块化规范
1 Common JS 介绍 Common JS 是模块化规范之一.每个文件都是一个作用域,文件里面定义的变量/函数都是私有的,对其他模块不可见.Common JS 规范在 Node 端和浏览器端有不 ...
- js模块化 javascript 模块化 闭包写法 闭包模块化写法
var main = main || {}; ; (function (main) { 'use strict'; //私有变量 var _s1 = 'Hello '; var _s2 = 'Worl ...
- 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 说明: ...
- JAVA模块化
今天转载JAVA模块化系列的三篇文章. 在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来 ...
- 【转载】Java 9 新特性——模块化
来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...
随机推荐
- Burp Suite Intruder中爆破模式介绍
Burp Suite Intruder中爆破模式介绍 - Introduction to Burst Mode in Burp Suite Intruder 1.sniper模式 使用单一的Payl ...
- Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week2, Optimization algorithms
Gradient descent Batch Gradient Decent, Mini-batch gradient descent, Stochastic gradient descent 还有很 ...
- html页面高度问题
首先,上图 说明 1. clientHeight大部分浏览器对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,即然是指可看到内 ...
- day 11 - 2 装饰器练习
1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件)要求登录成功一次,后续的函数都无需再输入用户名和密码 FLAG = False def login(func): def inner ...
- L - Tic-Tac-Toe FZU - 2283 (思维)
题目链接: L - Tic-Tac-Toe FZU - 2283 题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否 ...
- Django学习手册 - 权限管理(一)
权限管理原理: 不同角色拥有不同的角色权限,所以能否访问的页面也就不相同. 通过控制URL使用户访问到不同的URL,从而达到权限控制的目的. 设计权限数据库 权限管理 from django.db i ...
- 2016221 Java第二周学习补充
对switch语句的理解 在程序中遇到switch时,要将switch后的表达式与后续程序中的case常量进行比较,如若相等,程序将执行后面所有的case语句,直到遇到break 为止.如果走完整个程 ...
- SQLServer常用分页方式
mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试. 0.原来的SQL的所有数据 下面 ...
- [转] 理解CheckPoint及其在Tensorflow & Keras & Pytorch中的使用
作者用游戏的暂停与继续聊明白了checkpoint的作用,在三种主流框架中演示实际使用场景,手动点赞. 转自:https://blog.floydhub.com/checkpointing-tutor ...
- 709. To Lower Case
Algorithm to-lower-case https://leetcode.com/problems/to-lower-case/ 1)problem Implement function To ...