# 在 15 分钟内学习 Java 9 模块

> 原文： [https://beginnersbook.com/2018/09/java-9-modules/](https://beginnersbook.com/2018/09/java-9-modules/)

在本文中，我们将学习 Java 9 最重要的[特性 - “ **Java 9 模块**”。我们将涵盖所有内容，例如我们需要模块的原因，什么是模块，如何在 Java 中创建和使用模块。让我们开始吧。](https://beginnersbook.com/2018/04/java-9-features-with-examples/)

#### 关于模块的小背景

**Java 模块系统**是 Java 早就应该实现的**。模块系统是 Project Jigsaw 的一部分，最初计划在 Java SE 7 中发布但延迟并推迟到 Java SE 8 发布，但又因为它是一个巨大而有声望的项目，它已经从 Java SE 推迟 8 发布并最终在 **Java SE 9** 中发布。**

在下一节中，我将从基础知识中进行解释，以便每个人都能理解模块的需求。您可能会发现它是一个巨大的文本墙，但我向您保证，如果您仔细阅读它，您将能够理解模块背后的原因和想法。

## 为什么我们需要 Java 中的模块？

java 最重要的特性是可重用性，它允许我们在[继承](https://beginnersbook.com/2013/03/inheritance-in-java/)和[接口](https://beginnersbook.com/2013/05/java-interface/)的帮助下重用我们创建的类。我们可以在继承的帮助下继承类的行为，并且可以使用接口继承抽象。

为了有效地重用这些类，java 将它们分组在[包](https://beginnersbook.com/2013/03/packages-in-java/)中，并且它以这样的方式完成，以便类似类型的类在单个包中。对于例如当我们处理[集合](https://beginnersbook.com/java-collections-tutorials/)时，我们需要的大多数类和接口都在 java.util 包中。

随着我们的代码大小的增加，java 中的包也增加了。想象一下，使用数百个包来处理一个非常大的程序，在这种情况下，很难理解哪些类正在使用什么。包是组织类的好方法，但**需要在我们需要在代码中使用它们时组织包**。

此外，使类可以在包之间重用的唯一方法是将其公开，当我们公开它时，任何人都可以使用它。这也需要解决。

**Java 9** 引入了一个很酷的新功能来解决我们上面讨论过的问题。它引入了一个名为“模块”的新功能。 **“模块是一组包”**。模块不仅可以组织包，还可以处理可访问性，以便可以使用我们想要重用的模块的**部分，以及我们不想重用的部分，不能重复使用。**

直到现在我们在理论上讨论了所有内容，让我们在代码和图表的帮助下讨论模块。

## 什么是 Java 9 模块？

模块是一组包。我们在一个模块中有两种类型的包 - 1）导出的包 2）隐藏的包。

**导出的软件包：**这些软件包旨在在模块外部使用，这意味着任何其他模块中的任何程序都可以使用这些软件包。

**隐藏包：**这些包不在外面使用，它们在模块内部，只能在模块内部使用。

![Java 9 Module](img/f7a4cc0c5bdab5dd1f6a2214514d05e3.jpg)

为了进一步理解导出包和隐藏包的概念，我们举一个“java.base”模块的例子。

让我们借助下图了解这一点。在下图中，java.base 中的绿色块表示“导出的包”，有几个导出的包，但我只提到了其中的一些。绿色块中提到的这些包可以由外部类使用。

黄色块中的包装是隐藏包装，在模块外部无法访问。这些包仅用于模块内部。

在 java 中我们在 **module-info.java** 文件中定义模块并提及任何包作为导出包我们在**导出关键字**之后提到包的名称，如右侧所示（灰色）在下图中阻止。
![Module in Java 9 - exported packages & concealed packages](img/00a0198c75ab583081694caa11be79d2.jpg)

让我们在 Eclipse IDE 中编写程序并使用 Module 的概念。

## Java 9 模块 - 在 Eclipse IDE 中创建和使用模块

我们将在一个模块中创建一个类，并在另一个模块中使用该类。

#### 1.创建 Java 项目

![New Project in Java 9](img/b3e50116e07b602eb70b24ba3b0119e5.jpg)

我们正在 Eclipse IDE 中创建一个 java 项目。我们使用的项目名称是“beginnersbook.demo”。

#### 2.创建 module-info.java 文件

创建项目后，**右键单击项目名称**，转到“ **Configure** ”选项，然后单击“ **create module-info.java** ”选项如下截图所示。给出与项目名称“ **beginnersbook.demo** ”相同的模块名称。
![Create module-info.java file in Eclipse IDE](img/71cea594157a157ff990b591461d117c.jpg)

现在请将文件留空。我们稍后会来。

#### 3.创建包和类

我们在这个模块中创建了一个类，我们将在另一个模块中使用这个类。我们正在“ **beginnersbook.demo** ”包中创建一个类“ **BeginnersBook** ”。

BeginnersBook 类的源代码：

```java
package beginnersbook.demo;

public class BeginnersBook {
   public String welcomeMessage() {
      return "Welcome to BeginnersBook";
   }

}
```

#### 4.导出我们创建的包

由于我们计划在另一个模块中使用“BeginnersBook”类，因此我们可以将此包导出，以便可以在模块外部使用。为此，请在 **module-info.java** 文件 -
![module-info.java file](img/35ceba3526ffd70e6676b14c8e38c9c7.jpg)中编写此代码

```java
module beginnersbook.demo {
   exports beginnersbook.demo;
}
```

**项目 beginnersbook.demo 的最终结构如下：**
![Project Structure in Java 9 after creating module-info.java file](img/e5f512d03a3ef818f76933f981d7f8da.jpg)

#### 5.让我们创建另一个模块

让我们创建一个新的 java 项目，将其命名为“ **beginnersbook.user** ”，并按照我们上面创建的方式创建 **module-info.java** 文件，并将其命名为“beginnersbook” 。用户”。该项目的 module-info.java 文件包含以下代码：

```java
//module-info.java file
module beginnersbook.user {
   exports beginnersbook.user;
   requires beginnersbook.demo;
}
```

由于我们计划使用 beginnersbook.demo 包，因此我们在 require 关键字后面提到了包名，如上面的代码所示。

注意：您很可能会收到一条错误消息，指出包名称未解析，这是因为其他模块不在构建路径中。要解决此错误，请右键单击项目 beginnersbook.user，转到 Build Path - ＆gt;配置构建路径，如以下屏幕截图所示：
![Build Path - Modules in Java9](img/e8597edf0f0c8384fc0a7008b1836bab.jpg)

转到 **Projects** 选项卡，单击 **Modulepath** ，然后单击右侧的“Add”按钮，添加我们创建的上一个 java 项目“beginnersbook.demo”。你的最终屏幕应如下所示：
![Add Project to the Module Path - Java 9 Eclipse Oxygen](img/2e2a6a1f7d61365c62fd375e1b920638.jpg)

您的错误现在应该得到解决。

#### 6.让我们在第二个模块中创建一个类

在包含“ **beginnersbook.user** ”包的项目中创建一个类“ **BeginnersBookUser** ”。

BeginnersBookUser 类的源代码：

```java
package beginnersbook.user;
import beginnersbook.demo.BeginnersBook;
public class BeginnersBookUser {
   public static void main (String arg[]) {
      BeginnersBook obj = new BeginnersBook();
      System.out.println(obj.welcomeMessage());
   }
}
```

**两个项目的最终结构如下：**
![Java 9 Module Final project structure](img/fdbe2764ec0d85de80d7581820755c39.jpg)

#### 7.最后一步

让我们运行 BeginnersBookUser 类，你应该得到以下输出：

```java
Welcome to BeginnersBook
```

多数民众赞成。为了简要说明，我们在模块中创建了一个类并导出了包，以便可以在模块外部使用该类。
为了测试它，我们在另一个模块中创建了另一个类，并使用了导出的包，最后使用了我们首先创建的类。