Java9经历了多次跳票,终于要在9月份正式发布,原计划Jigsaw在Java7就有的,也终于在Java9里面提供了,简单总结下。

对比 Java9 以前

上面2个图分别对应的分别是JDK8/9的目录下的 src.zip 文件,从图片上看上 Java9 的目录都发生变化了,从以前的一个 java 里面就拆除了好几个模块,比如 java.logging, java.desktop, java.se 等,当然也把之前存放在 tool.jar 里面的合并到了 jdk.* 的模块里面。而替化 rt.jar,tools.jar ,是 JDK9/jmods 文件下 *.jmod 文件

这样带来的好处在于,开发 javafx 就不用关心 java.se.ee 里面的内容。同时也让代码内部的依赖变得更加清新

(模块化之前,包与包之间的依赖,来源:http://cr.openjdk.java.net/~mchung/jigsaw/graphs/jdk7-b65.png )

(模块与模块之间的依赖,来源:https://bugs.openjdk.java.net/secure/attachment/21573/jdk-tr.png )

  • 公开不再意味者可以访问

Java9由于提供了模块化,使得对 package 的控制更精细了,这与 maven 的通过依赖不同之处,在于 maven 使用了dependency 进行管理依赖,而 jigsaw 使用 requiure 进行管理依赖,通过 export,可以只暴露某个模块下指定的包给调用者。

Quick Start

编写模块化的代码和没有模块化的代码区别并不大,java9 通过根目录下的 module-info.java 文件进行区分。

src
└── main
└── java
├── com
│ └── fzb
│ └── jigsaw
│ └── Hello.java
└── module-info.java

cat src/main/java/com/fzb/jigsaw/Hello.java

package com.fzb.jigsaw;

public class Hello {

    public static void main(String[] args) {
System.out.println("Cool, Java9 Jigsaw!");
}
}

cat cat src/main/java/module-info.java

module hello.jigsaw {
exports com.fzb.jigsaw;
}

和没有模块化的代码一样的也是使用 javac 进行编译,java 执行

#!/usr/bin/env bash
rm -rf mods
mkdir mods
javac -d mods/hello.jigsaw src/main/java/module-info.java src/main/java/com/fzb/jigsaw/Hello.java

java --module-path mods -m hello.jigsaw/com.fzb.jigsaw.Hello

输出

Cool, Java9 Jigsaw!

其实到这里还是不太清楚又和之前的区别,java8 使用 --classpath,而模块化后使用的 --module-path,关键在于如果把这些文件打包成为独立的模块(.jmod文件),便于其它模块调用。在 java9 以前库的单元是 jar 文件,但是 java9 后,jmod 可能会取代 jar 。

jmod

  • 创建jmod jmod create --class-path=mods/hello.jigsaw/ hello.jigsaw.jmod
  • 查看jmod jmod list hello.jigsaw.jmod

jlink

jlink 是一个比较强大的命令,可以将指定的 .jmod 文件解压到指定目录,这个文件夹包含了运行时需要的所有文件,比如以后下载一个 jmerer 可能教程里面第一步不再会写如何安装JDK/JRE了,而是下载对应平台的 .zip 文件,解压,运行对应的 .sh/.bat 文件了。

jlink --module-path $JAVA_HOME/jmods/:mlib/ --add-modules hello.jigsaw --output jlink

整个文件夹并不大,仅导入 java.base ,才45m,通过压缩后为zip文件后大小才16m。当然和C/C++这里直接编译为计算机码差别还是比较的大。但是 java.base 包里面的能做事,这一点体量还是可以接受的。

bin/java com.fzb.jigsaw.Hello

输出

Cool, Java9 Jigsaw!

Demo

可能一下子还感觉不到这样的方便,与是将了一个之前做的一个类 nginx 的 auoindex 的java小程序改为java9的,体积才16m(请与jre包的大小对比)。

下载

总结

Java9 虽然经历多次跳票,但是这次更新还是诚意满满的(不过Java为什么就不内置个Json工具),jigsaw 对一些客户端程序影响还是比较大的,对服务端程序就没有那么的明显了,毕竟还有好多都在用着Java7。相对比OSGi的概念简单很多,上手容易,但是对于服务的注册发现并没有太多的实现。不过目前支持的包太少了,想要真正的使用上还的需要些时间。

from: https://zhuanlan.zhihu.com/p/29563164

Java9模块化(Jigsaw)初识的更多相关文章

  1. java9 模块化 jigsaw

    java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...

  2. JAVA9模块化详解(一)——模块化的定义

    JAVA9模块化详解 前言 java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性--模块化.模块化系统的主要目的如下: 更可靠的配置,通过制定明确的类的依赖关系代替以前那种易错的 ...

  3. JAVA9模块化详解(二)——模块的使用

    JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...

  4. Java9 modules (Jigsaw)模块化迁移

    要点 通过模块化的方式开发应用程序,实现更好的设计,如关注点分离和封装性. 通过Java平台模块化系统(JPMS),开发者可以定义他们的应用程序模块,决定其他模块如何调用他们的模块,以及他们的模块如何 ...

  5. Javascript模块化编程-初识[1]

    JS模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心业务逻辑,其他都可以加载别人已经写好的模块. 但是,JS不是一种模块化编程语言,它不支持类,所以没有严格意义上的模块.为了实现模 ...

  6. Java 9 模块化(Modularity)

    JDK9的发布一直在推迟,终于在2017年9月21日发布了.下面是JDK9的几个下载地址: JDK9.0.1 Windows-x64下载地址 Oracle Java 官网下载地址 OpenJDK 9官 ...

  7. Java11实战:模块化的 Netty RPC 服务项目

    Java11实战:模块化的 Netty RPC 服务项目 作者:枫叶lhz链接:https://www.jianshu.com/p/19b81178d8c1來源:简书简书著作权归作者所有,任何形式的转 ...

  8. java9模块不可见问题

    问题描述 jdk.internal.reflect包不可见 问题原因 java9模块化之后,java.base只把jdk.internal.reflect暴露给了少数几个内部包而没有向当前模块暴露. ...

  9. 《Java程序员修炼之道》

    原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock( ...

随机推荐

  1. https配置注意细节

    直接将阿里云https的ca配置配置好之后如果不通的话很有可能是防火墙原因造成的,还有就是nginx要用1.10以上版本的

  2. 解决springmvc+fastjson返回页面出现乱码问题

    在controller里面的接口上面加,produces="text/html;charset=UTF-8"即可 @RequestMapping(value = "/ad ...

  3. JavaScript跨域解决方法大全

    跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...

  4. 关于进度管理工具Gantt图

    关于进度管理工具Gantt图 18.以下关于进度管理工具图的叙述中,不正确的是( D). A.能清晰地表达每个任务的开始时间.结束时间和持续时间 B.能清晰地表达任务之间的并行关系 C.不能清晰地确定 ...

  5. 15:django 缓存架构

    动态网站的一个基本权衡就是他们是动态的,每次一个用户请求一个页面,web服务器进行各种各样的计算-从数据库查询到模板渲染到业务逻辑-从而生成站点访问者看到的页面.从处理开销的角度来看,相比标准的从文件 ...

  6. 解决Myeclipse编译不生成.class文件问题

    1.Project --> clean...  如果该操作无效,请执行2. 2.Preferences -->Java -->Compliler -->Building --& ...

  7. Fel表达式实践

    项目背景 订单完成后,会由交易系统推送实时MQ消息给订单清算系统,告诉清算系统此订单交易完成,可以进行给商家结算等后续操作. 财务要求在交易推送订单到清算系统时和订单清算系统接收到订单消息后,需要按照 ...

  8. Jmeter-----随机生成手机号后8位并去重,来进行注册手机号的压测

    要求:对注册接口进行100000次压测,手机号已126开头,后面的8位数不限 前言:在进行测试中,我们需要对注册接口进行压测100000次,那么就要求手机号码每次填写的不一致,否则手机号使用一次后会出 ...

  9. [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1212  Solved: 694[Submit][Stat ...

  10. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...