什么是模块?

一个模块是代码的集合。它以依赖关系的形式持有类,数据和其他模块。它与JAR文件类似,但更好。每个模块都包含一个module-info.java文件,它可以让我们明确地设置必要的信息。包括它依赖的其他模块以及其他模块可以访问的内容。
这是一种更好的方式,可以为程序员共享代码并进行协作减少一些兼容性的问题。

如何使用模块?

一个模块包含一个module-info.java文件 ,它包含了模块的基本信息,比如它依赖哪些模块、它的哪些部分能被其他模块访问等。
最主要的关键词是requiresexports
现在,我们来写举几个简单的例子:

module Decoder {
 
  requires Reader;
  exports com.decoder;
 
}

上面的这个例子表明了Decoder模块依赖于Reader模块。
下一行则声明其他模块只能访问com.decoder包以内的内容。

module Reader {

  exports org.reader;
}

这个例子声明Reader模块不依赖于别的模块,
其他模块只能访问org.reader包以内的内容。

下面两个类分别位于Reader模块和Decoder模块。
Decoder模块通过Reader模块的Scanner类来读取内容。

org/reader/Scanner.java:

package org.reader;

public class Scanner {
  public static String read() {
    return "这是一段文本";
  }
}

com/decoder/Main.java:

package com.decoder;

import org.reader.Scanner;

public class Main {
  public static void main(String[] args) {
    System.out.format("从Scanner中读取到: %s %n", Scanner.read());
  }
}

模块系统的特性

  • 提高安全性,模块系统可以让我们隐藏那些我们不想暴露出来的类,具有极高的封闭性。
  • 提高项目的可维护性。修改一个模块内的代码不会影响到其他的模块。当你把项目分成许多个模块之后,你只需要重新编译改动的模块,而不再需要重新编译整个项目。
  • 更加容易地测试。

参考资料

Java 9 Modularity explained in 5 minutes