Java9模块化(Jigsaw)初识
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)初识的更多相关文章
- java9 模块化 jigsaw
java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...
- JAVA9模块化详解(一)——模块化的定义
JAVA9模块化详解 前言 java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性--模块化.模块化系统的主要目的如下: 更可靠的配置,通过制定明确的类的依赖关系代替以前那种易错的 ...
- JAVA9模块化详解(二)——模块的使用
JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...
- Java9 modules (Jigsaw)模块化迁移
要点 通过模块化的方式开发应用程序,实现更好的设计,如关注点分离和封装性. 通过Java平台模块化系统(JPMS),开发者可以定义他们的应用程序模块,决定其他模块如何调用他们的模块,以及他们的模块如何 ...
- Javascript模块化编程-初识[1]
JS模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心业务逻辑,其他都可以加载别人已经写好的模块. 但是,JS不是一种模块化编程语言,它不支持类,所以没有严格意义上的模块.为了实现模 ...
- Java 9 模块化(Modularity)
JDK9的发布一直在推迟,终于在2017年9月21日发布了.下面是JDK9的几个下载地址: JDK9.0.1 Windows-x64下载地址 Oracle Java 官网下载地址 OpenJDK 9官 ...
- Java11实战:模块化的 Netty RPC 服务项目
Java11实战:模块化的 Netty RPC 服务项目 作者:枫叶lhz链接:https://www.jianshu.com/p/19b81178d8c1來源:简书简书著作权归作者所有,任何形式的转 ...
- java9模块不可见问题
问题描述 jdk.internal.reflect包不可见 问题原因 java9模块化之后,java.base只把jdk.internal.reflect暴露给了少数几个内部包而没有向当前模块暴露. ...
- 《Java程序员修炼之道》
原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock( ...
随机推荐
- php常见术语
什么是PHP? php是Hypertext Preprocessor的缩写,php是一种内嵌 HTML的脚本语言.PHP的独特语法混合了c,java和perl及PHP式的新语法.这门语言的的目标是让网 ...
- jQuery使用blur()方法触发两次的解决方法
在项目中的textarea在是去焦点时对文本内容进行验证,这时候使用了blur方法,但是实现时blur的回调函数执行了两次,这里我也不知道为什么,然后就尝试先解除blur事件绑定,然后再绑定blur事 ...
- SRM 638 Div.2
250 给一个字符串 要求从一种形式换成另一形式 class NamingConvention{ private: int a, b, c; public: int d; string toCamel ...
- 手机端调试console.log,直接引入一个js文件
http://files.cnblogs.com/files/lwwen/mConsole.js 这是我写的一个原生js文件 直接引入即可,可以把html上面的需要打印的东西打印出来 <!DOC ...
- Excel Sheet Column Title&&Excel Sheet Column Number
Excel Sheet Column Title Given a positive integer, return its corresponding column title as appear i ...
- Linux磁盘的性能详细测试办法
# 测试写入20Gb文件sync && time -p bash -c "(dd if=/dev/zero of=test.dd bs=1000K count=20000; ...
- AC日记——Sagheer, the Hausmeister codeforces 812b
812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #includ ...
- Docker for Windows 里的Shared Drives 设置不生效
原文地址:传送门 问题描述:Docker中的settings里的Shared Drives 选择对应盘符后,点击Apply后无法生效,没办法选择对应盘符进行分享. 解决办法:win+R ,键入gped ...
- php类的定义
<?php /** * Created by PhpStorm. */ class People { //支持带参数 //类的构造方法 /** * Man constructor. * @par ...
- 图片上传功能(EasyUI前台框架+SSM框架)
文件上传步骤: * 1.采用文件正确的接收方式(修改3处配置文件/接口类型等) * 2.判断是否为一个图片,0表示无异常,1代表异常(jpg|gif|png) * 3.判断是不是一个“正经”的图片,判 ...