设为首页 | 加入收藏

欢迎访问幸运彩票官网3132-幸运彩票官方网站-幸运彩票导师计划

中心动态 >> 幸运彩票官网3132-JAVA9 模块体系的运用

什么是模块体系

Java 9 最大的改变之一是引进了模块体系(Jigsaw 项目)。

模块便是代码和数据的封装体。模块的代码被组织成多个包,每个包中包含Java类和接口;模块的数据则包含资源文件和其他静态信息。

Java 9 模块的重要特征是在其工件(artifact)的根目录中包含了一个描绘模块的 module-info.class 文 件。 工件的格局可所以传统的 JAR 文件或是 Java 9 新增的 JMOD 文件。这个文件由根目录中的源代码文件 module-info.java 编译而来。该模块声明文件能够描绘模块的不同特征。

为什么要运用模块化

java开发者都知道,运用java开发运用程序都会遇到一个问题,Jar hell,他就像windows里的dll hell。

比方咱们发动一个不算大的运用,但依靠了许多的jar,如下图:

摘自:Mark Reinhold的讲演 www.youtube.com/watch?v=l1s…

这是很常见的。尽管你能够运用 "java -Djava.ext.dirs=lib xxx" 让命令行小一些,但不行否认,他的classpath便是那么长。趁便说一句,java9中不允许运用extdirs了。

另一方面,jdk自身有许多的api:

怎么运用模块体系

在 module-info.java 文件中,咱们能够用新的关键词module来声明一个模块,如下所示。下面给出了一个模块com.mycompany.mymodule的最基本的模块声明。

module com.runoob.mymodule {
}

创立模块

接下来咱们创立一个 com.runoob.greetings 的模块。

第一步

创立文件夹 /home/xx/JAVA/src,然后在该目幸运彩票官网3132-JAVA9 模块体系的运用录下再创立与模块名相同的文件夹 com.runoob.greetings。

第二步

在 /home/xx/JAVA/src/com.runoob.greetings 目录下创立 幸运彩票官网3132-JAVA9 模块体系的运用module-info.java 文件,代码如下:

module com.runoob.greetings { }

module-info.java 用于创立模块。这一步咱们创立了 com.runoob.greetings 模块。

第三步

在模块中增加源代码文件,在目录 /home/xx/JAVA/src/com.runoob.greetings\com\runoob\greetings 中创立文件 Java9Tester.java,代码如下:

package com.runoob.greetings;
public class Java9Tester {
public static幸运彩票官网3132-JAVA9 模块体系的运用 void main(String[] args) {
System.out.println("Hello World!");
}
}

第四步

创立文件夹 /home/xx/JAVA/src/,然后在该目录下创立 com.runoob.greetings 文件夹,编译模块到这个目录下:

 javac -d mods/com.runoob.greetings 
src/com.runoob.greetings/module-info.java
src/com.runoob.greetings/com/runoob/greetings/Java9Tester.java

第五步

履行模块,检查输出成果:

C:/>JAVA> java --module-path mods -m com.runoob.greetings/com.runoob.greetings.Java9Tester
Hello World!

module-path 指定了模块地点的途径。

-m 指定首要模块。

內建的module

jdk原生的包被归并到內建的module里,如java.base模块:

module java.base{
exports java.io;
exports java.lang;
exports java.lang.annotation;
exports java.lang.invoke;
exports java.lang.module;
exports java.lang.ref;
exports java.lang.reflect;
exports java.lang.math;
exports java.lang.net;
//...
}

一切的运用都会默许依靠 java.base,就像曾经咱们不必显式的 "import java.lang.*;" 相同。

这儿验证了前面helloworld中,为什么反编译模块文件之后会多了一个:"requires java.base;"。

下面的 com.foo.app 模块,不需要显式地引进java.base:

假如此刻com.foo.bar 增加了 com.foo.baz 模块的引证。

那么,咱们知道 com.foo.bar 也隐式 引进了 java.base。

相同的道理,com.foo.baz 模块也隐式引证了 java.base:

牢靠的装备

持续深化下去,咱们知道 java.sql 引证了其他很多的api,那么下图就不难理解了。

现在的模块结构,称为可读的模块,供给了牢靠的装备。

假如引证了不存在的module,和jar相同,你相同会触发 xx not found.

编译时:

运行时:

可拜访的类型

假如引证的模块没有导出某个类,那么是不行拜访的,这称为强封装。

比方 com.pupupulafoo.bar 模块中有一个内部类BetaImpl:

比方 com.foo.bar 模块中有一个内部类BetaImpl:

那么在 com.foo.bar 模块的自动引证模块 com.foo.app 中如下运用 BeatImpl:

在编译时,会触发反常:

便是说:BetaImpl不行拜访,由于包 com.foo.bar.beta.internal 包没有被导出。

相同,即使运用导出版别修改成功,而运行时引证了未导出版别模块:

检查內建的模块

$ jmod list $JAVA_HOME/jmods/java.base.jmod
classes/module-info.幸运彩票官网3132-JAVA9 模块体系的运用class
classes/apple/security/AppleProvider$1.class
...
classes/java/lang/Object.class
...
bin/java
bin/keytool
...
conf/security/java.policy
...

检查更多内建模块:

$ java --list-modules
java.activation@9
java.base@9
java.compiler@9
java.corba@9
java.datatransfer@9
java.desktop@9
//...节约篇幅略



上一条      下一条
返回顶部