关于 java9的新特性,官方原文:https://docs.oracle.com/javase/9/whatsnew/toc.htm
这玩意就是一个列表,具体的技术细节需要根据官方文档挖一挖。
modular-模块系统
java9的模块化,从一个独立的开源项目而来,名为Jigsaw。
项目官网:http://openjdk.java.net/projects/jigsaw/
为什么要使用模块化
java开发者都知道,使用java开发应用程序都会遇到一个问题,Jar hell,他就像windows里的dll hell。
比如我们启动一个不算大的应用,但依赖了很多的jar,如下图:
摘自:Mark Reinhold的演讲 https://www.youtube.com/watch?v=l1s7R85GF1A
这是很常见的。虽然你可以使用 “java -Djava.ext.dirs=lib xxx” 让命令行小一些,但不可否认,他的classpath就是那么长。顺便说一句,java9中不允许使用extdirs了。
另一方面,jdk本身有很多的api:
对于一些小设备,它太庞大了。
helloworld
还是习惯先来一个helloworld。在此之前,需要先检查一下你的java版本:
java -version
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
如果不是java9,而是 1.8、1.7,那么慢走不送。
创建主类
首先创建一个java类,就叫Demo吧。
文件保存为:src/com/pollyduan/modular/Demo.java
package com.pollyduan.modular;
public class Demo{
public static void main(String[] args){
System.out.println("hello modular.");
}
}
编译:
$ javac -d classes src/**.java
$ tree .
.
├── classes
│ └── com
│ └── pollyduan
│ └── modular
│ └── Demo.class
└── src
└── com
└── pollyduan
└── modular
└── Demo.java
打包jar并执行
$ mkdir lib
$ jar cvf lib/demo.jar -C classes .
$ java --class-path lib/demo.jar com.pollyduan.modular.Demo
hello modular.
–class-path 开关可以简写:
$ java -cp lib/demo.jar com.pollyduan.modular.Demo
当然我们可以为jar指定主类,来简化运行:
Main-Class: com.pollyduan.modular.Demo
需要在MANIFEST.MF 中增加上面一行,即可直接运行:
$ java -jar lib/demo.jar
创建模块
src/module-info.java
module hello{}
我们写了一个空的模块,命名为hello。
编译模块
$ javac -d classes src/**.java
反编译看一下:
$ javap classes/module-info.class
Compiled from "module-info.java"
module hello {
requires java.base;
}
为什么我们写了一个空的模块,反编译多了一行?先不用管,后面会说明为什么。
打包模块
$ jar cvf lib/hello.jar -C classes .
$ jar tf lib/hello.jar
META-INF/
META-INF/MANIFEST.MF
module-info.class
com/
com/pollyduan/
com/pollyduan/modular/
com/pollyduan/modular/Demo.class
运行模块
$ java --module-path lib -m hello/com.pollyduan.modular.Demo
h