初探jdk11 中的module,jmod,jlink
Posted java技术大本营
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探jdk11 中的module,jmod,jlink相关的知识,希望对你有一定的参考价值。
当时听到jdk11发布之后,立马就下载下来了,然后把原来的jdk8切成11之后,程序还是可以照样的跑,算是一个平稳的过渡,但是有些代码做了改变,如MD5加密的,在jdk8调用时,就提示这个是内部函数,可能会在以后的发行版本中删除。再如Unsafe的获取方法,在jdk8中可以通过反射来获取,在jdk11中, Unsafe被移到了jdk.unsupport
里面了,可以通过以下代码来尝试获取:
Field unSafeField = null;
try {
unSafeField = Unsafe.class.getDeclaredField("theUnsafe");
unSafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unSafeField.get(null);
System.out.println(unsafe);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
新的变量声明方式
以前老师教我们,写java时,声明的变量类型要和new
的变量类型一致,在11中放松了这一限制,(是11还是10里面就放松了我也记不太清楚了,反正就是现在放松了)对比见以下代码
//jdk8及以前的写法
Integer a = Integer.valueOf(1);
//jdk11 的写法
var b = Integer.valueOf(2);
写法虽然简化了,但说实话,笔者个人还是更喜欢以前的写法,因为以前的写法可以声明的啥一目了然。
新的打包方式
这一段停顿了好几天才开始写,因为国内相关的资料很少,爬了好久的google的坑才算是运行了出来
大家都知道从jdk9
开始,java转成了模块化。写代码时需要添加一个描述性的文件module-info.java
,这个文件描述了我们需要哪些模块,然后把当前模块的哪些包设置为可以被引用(相当于public )
编译
代码还是和以前maven的项目一样的写,然后编译也是一样的编译,用javac 或者maven的compile,我们得到了 target/classes目录
创建jmod
创建也很简单,使用jmod create
命令:jmod create --class-path target/classes jmod/utils-base.jmod
其中 --class-path
是对应着我们编译出来的.class
文件,后面是生成的jmod
文件存放的地方
执行完我们会看到这样一个文件:其作用,可以简单理解为和.jar
一样的作用
生成运行时镜像
看这个标题感觉很高大上,对这个概念我的理解是打包成一个可以运行的东西出来,如标题所示,生成好一个镜像后,然后带着镜像就可以到处跑,到处运行了。在示例项目中,utils-se 依赖utils.base , utils.base刚才已经打好了一个jmod出来,现在我们要对utils.se创建镜像
创建运行时镜像主要是使用jlink
命令:jlink --module-path D:/javafx-jmods-11.0.1;../utils-base/jmod;jmod --add-modules=utils.fx --output jfx
--module-path
是依赖的jmod路径,因为我这是一个javaFX程序,所以还依赖了javafx-jmods。
--add-modules
添加当前的模块
--output jfx
是输出的文件夹
执行完命令之后,我们可以看到目录有以下变化:
我们要的可执行文件,就在bin里面
运行
创建好镜像后,我们来运行看看,运行就用平常的java
就可以啦:jfx\bin\java -m utils.fx/fx.ideashare.jfx.JFXMain
-m
是指定模块 后面是 ${模块名}/${包名}.${Main函数}
。执行后,就可以把java程序给运行起来啦:
这是我做的一个小工具,因为在windows上markdown写作时,没有mac上的ipic可以上传图床,然后就自己弄了一个,可以监听剪贴板上的文件,然后上传到服务器,返回一个可访问的链接。
总结
爬坑的道路很漫长,官方文档说的太抽象,国内没有什么例子,国外也没太多的例子,可能那些大牛们觉得这个太简单不想写吧,但总算是一步步的做了出来,特此做成一个小记和大家分享下
以上是关于初探jdk11 中的module,jmod,jlink的主要内容,如果未能解决你的问题,请参考以下文章