初探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目录  

初探jdk11 中的module,jmod,jlink

创建jmod

创建也很简单,使用jmod create命令:jmod create --class-path target/classes jmod/utils-base.jmod

其中 --class-path 是对应着我们编译出来的.class 文件,后面是生成的jmod文件存放的地方

执行完我们会看到这样一个文件:其作用,可以简单理解为和.jar一样的作用

初探jdk11 中的module,jmod,jlink

生成运行时镜像

看这个标题感觉很高大上,对这个概念我的理解是打包成一个可以运行的东西出来,如标题所示,生成好一个镜像后,然后带着镜像就可以到处跑,到处运行了。在示例项目中,utils-se 依赖utils.base , utils.base刚才已经打好了一个jmod出来,现在我们要对utils.se创建镜像

初探jdk11 中的module,jmod,jlink

创建运行时镜像主要是使用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是输出的文件夹

执行完命令之后,我们可以看到目录有以下变化:

初探jdk11 中的module,jmod,jlink

我们要的可执行文件,就在bin里面

运行

创建好镜像后,我们来运行看看,运行就用平常的java就可以啦:jfx\bin\java -m utils.fx/fx.ideashare.jfx.JFXMain  

-m是指定模块 后面是 ${模块名}/${包名}.${Main函数}。执行后,就可以把java程序给运行起来啦:

这是我做的一个小工具,因为在windows上markdown写作时,没有mac上的ipic可以上传图床,然后就自己弄了一个,可以监听剪贴板上的文件,然后上传到服务器,返回一个可访问的链接。

总结

爬坑的道路很漫长,官方文档说的太抽象,国内没有什么例子,国外也没太多的例子,可能那些大牛们觉得这个太简单不想写吧,但总算是一步步的做了出来,特此做成一个小记和大家分享下



以上是关于初探jdk11 中的module,jmod,jlink的主要内容,如果未能解决你的问题,请参考以下文章

Golang modules 初探

Golang modules 初探

golang包管理解决之道——go modules初探

初探Java 9 的的模块化

初探Java设计模式4:JDK中的设计模式

初探JDK源码之默认字符集