什么是JVM? JVM的基础理解

首先,对于模组平台系统要知道的第一件事是,它跟Java程序语言本身没有关系,而是为了管理程序库本身的功能封装,程式库之间的相依性等需求而存在,将一个不支援模组的程式库改为支援模组,基本上不用修改程式库中的程式码。那么为什么模组可以改进程式库的封装性与相依性?如果你基于A程式库撰写了新的程式库,接着有同事想要使用你的程式库,而你不想要他直接呼叫A程式库的相关功能,以免他撰写的程式直接依赖在A程式库上,就目前你知道的知识来说,只要类别路径上可以找到A程式库的相关类别,他就可以呼叫相关功能,日后程式库之间错综复杂的相依性就从此开始了,而这也是目前的Java生态圈中面临的重大问题之一。当然,Java生态圈20几年来,也为了这样的问题提出了解决方案,也有第三方(第三方)的模组系统,而为了了要统一模组平台的规格,以及为Java SE平台瘦身(让小型运算装置可以依需要下载必要的模组而不是整个JRE),改进安全等因素,Java SE 9决定纳入模组平台系统成为标准之一。模组平台系统跟Java程序语言本身没有关系,而且指令上的运用较杂,基本上会有相关开发工具代劳指令处理这些细节,不过,透过一些手动建立模组的过程,有助于了解模组的基本架构,也比较清楚开发工具大致上代劳了哪些细项。那么就来开始建立第一个模块吧!首先看看,一个未支援模组的程序专案要如何设定,才能使之成为模组。请复制范例档资料夹中的Hello2资料夹至C: \ workspace,Hello2中有个src资料夹,其中有cc \ openhome \ Main.java档案,你应该已经懂得它撰写的内容了:

package cc.openhome;

public class Main {

    public static void main(String[] args) {

        System.out.println("Hello, World");

    }}

根据先前几个小节的介绍,你应该知道在进入Hello2资料夹后,可以使用底下的指令来编译并执行程式:

javac -d classes src/cc/openhome/Main.java

java -cp classes cc.openhome.Main

这是基于类别路径的方式,若想要设定它为模组,第一件事是决定模组名称,这边假设模组名称为cc.openhome,建议建立一个与模组名称相同的资料夹, 然后其中依套件设定的阶层放入原始码,在这边可以在src中建立cc.openhome资料夹,然后将原先src中的cc资料夹放到cc.openhome资料夹之中:

接下來,在 cc.openhome 资料夹中建立一个 module-info.java 並撰写底下內容:

 

这么一来,在原始码层面上,你就建立了第一个模组了,虽然module-info.java的副档名为.java,它实际上只是个设定档,其中的模块关键字仅在 这个设定档中进行设定之用,不是Java程式语言的一部份,副档名为.java,单纯只是为了相容性,让javac等工具程式易于处理这个设定档罢了。

上图的模块关键字定义了模组名称为cc.openhome,除此之外没有其他设定,这表示目前只能存取同一模组以及Java标准API的java.base模组,java.base模组 中包含了像是java.lang等常用的套件;言下之意也表示,日后必要的话,可以在module-info.java中设定自己的模组可以公开哪些API,或者是依赖在哪个模组之上。

那么来编译码吧吧!可以将编译出来的类别放在mods资料夹中对应模块名称的资料夹之中:

这么一来,mods中的cc.openhome就是你第一个编译成功的模组了,其他开发者若要使用这个模组,可以在执行java时,透过--module-path指定模组路径。

由于Main.java中实际上撰写了程式进入点,如果想要执行它的话,可以透过-m指定模组的程式进入点,例如:

图中使用了--module路径指定了模组路径,而不是使用-classpath指定类别路径,这个时候要注意的是,在完全吻合名称之前还要指定模组名称,然而,这仅仅只是工具层面 的需求,在程式码撰写上,使用模组中的API并不用进行任何变更。

基于相容性,模组也可以基于类别路径来使用,方式与先前的说明是相同的,例如:

按照规范,在类别路径下被发现的类别,都会被自动归类到一个未命名的模组(unnamed module),就目前来说,你只要知道这些类别彼此之间的可见性,与Java SE 8 或先前版本的可见性相同就可以了,如果马上就想进一步认识未命名模组,可以参考<未命名模块>中的介绍。

猜你喜欢

转载自www.cnblogs.com/Ampere90/p/9907329.html