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. tornado 模版

    tornado 模版语法 取消转义 : 取消项目转义 :autoescape = None 取消模版转义:{% autoescape None %} 取消行转义   :{% raw bd %} 强制转 ...

  2. How To Install Nginx on Ubuntu 16.04 zz

    Introduction Nginx is one of the most popular web servers in the world and is responsible for hostin ...

  3. C# 实现动态添加列,新增合计行,求和

    DataTable da = CommonBLL.GetList("*", "sys_dict", "IfState=1 and DictTypeId ...

  4. hdu 3572(构图+最大流)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  5. CSAPP lab1 datalab-handout(深入了解计算机系统 实验一)

    主要涉及计算机中数的表示法: (1)整数: two's complement,即补码表示法 假设用N位bit表示整数w: 其中最左边一位为符号位,符号位为0,表示正数,为1表示负数. (2)浮点数: ...

  6. mybatis官网学习

    javaType:一个 Java 类的完全限定名,或一个类型别名(参考上面内建类型别名 的列表) .如果你映射到一个 JavaBean,MyBatis 通常可以断定类型. 然而,如果你映射到的是 Ha ...

  7. 图片乱码问题 解决方法 php

    两个开发者都是下载同一个项目的git代码,但到本地环境,一个可以正常显示图片验证码,一个不行,找个半天开始以为环境问题 找了半天 不是 很多没说到重点 其实不只是当前文件格式问题 也要考虑其他调用文件 ...

  8. 转:Python安全 - 从SSRF到命令执行惨案

    转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PH ...

  9. SSH整合错误三连

    访问Action错误 ognl.MethodFailedException: Method "add" failed for object com.test3.action.Use ...

  10. 单能X射线产生方法

    主要是荧光 利用布拉格准则, 关键词如下.. 国内有些专利 monochromating crystal spectrometer 物理实验设备名称翻译 ... 单色光检糖计 monochromati ...