当前位置: 首页 > 图灵资讯 > 技术篇> Java模块系统详细介绍

Java模块系统详细介绍

来源:图灵教育
时间:2023-04-04 10:30:19

Java 随着相关生态的不断丰富,一些问题也越来越暴露出来,要解决这些问题,Java 9中的java模块系统应运而生。Java 在9之前,Java是顶级代码组织元素。从Java开始 9开始发生了一些变化:模块在软件包的顶部,它可以收集相关软件包。

Java平台模块系统模块系统(JPMS)它是一个代码级结构,所以它不会改变我们将Java包装到Jar文件中的事实。最后,所有内容仍然绑定在JAR文件中。通过合并module-info.Java文件,模块系统添加了Jar可以使用的新的更高级别的描述符。大型应用程序和组织将使用模块更好地组织代码。本质上,模块(module)事实上,package的概念是在package外包裹另一层,也就是说,用模块管理每个package,并通过声明某个package暴露,而不声明默认是隐藏的。因此,模块化使代码组织更安全,因为它可以指定哪些部分可以暴露,哪些部分可以隐藏。但由于JDK及其类型已经模块化,每个人都会使用模块化。

JPMS是Jigsaw项目的成果,其目标是实现以下目标:

1.使开发人员更容易组织大型应用程序和库

2.改善平台和JDK本身的结构和安全性

3.提高应用程序性能

4.更好地处理小型设备的平台分解

值得注意的是,值得注意的是,JPMS是SE(标准版)功能,从一开始就影响Java的各个方面。尽管如此,更改的目的是使大多数代码从Java开始 搬到Java 9点无需修改即可运行。对此有一些例外,我们将在本概述的后部进行解释。

模块背后的主要思想是收集模块中可见的相关程序包,并将元素隐藏给模块的外部用户。换句话说,模块允许另一级包装。

类别路径和模块路径:到目前为止,在在Java中,类路径一直是正在运行的应用程序可用内容的底线。虽然类路径的目的已经广为人知,但它最终是一个大的,没有不同的存储桶,所有的依赖项都放在其中。模块路径在类路径上方添加一个级别。它作为程序包的容器,并确定应用程序可以使用哪些程序包。

JDK本身现在由模块组成JDK安装目录中有一个/lib目录。这个目录是srcc。.zip文件。将其解压缩到/src目录中。在/src目录中搜索,然后导航到/java.base目录在那里找到module。-info.java文件打开它。

在顶部的Javadoc注释后,找个名字module java.base的部分,你会看到许多Java熟悉的软件包(如Java.io)都来自java.在base模块中导出。是将软件包收集在一起的模块的本质。

另一exports是requires指令。运行Java编译器时,可以通过类似路径的方式指定模块路径。

让我们来看看模块化Java工程结构。我们将制作一个包含两个模块的小程序,一个模块提供一个依赖关系,另一个模块使用该依赖关系并导出可执行的主类。创建一个方便的文件系统位置的新目录。叫它/com.javaworld.mod1。Java模块位于与模块同名的目录中。在此目录中创建module-info.java文件。在内部,添加下面中的内容

com.javaworld.mod1 / module-info.java

module com.javaworld.mod1 {

exports com.javaworld.package1;

}

请注意,模块和导出包的名称不同。我们正在定义导出包的模块。

现在,它包含在内module-info.在java文件目录的这条路径上创建文件/com.javaworld.mod1/com/javaworld/package1。命名文件 Name.java。将下面的把内容放进去

Name.java

package com.javaworld.package1;

public class Name {

public String getIt() {

return "Java World";

}

}

上面的代码它将成为我们所依赖的类别,包和模块。然后,创建另一个与之平行的目录/com.javaworld.mod1 并调用它/com.javaworld.mod2。在这个目录中创建一个module-info.java模块定义将导入我们创建的模块,例如下面的代码所示。

com.javaworld.mod2 / module-info.java

module com.javaworld.mod2 {

requires com.javaworld.mod1;

}

这个代码的意义不言而喻。它定义了它。com.javaworld.要求commod2模块.javaworld.mod1。

/com.javaworld.在mod2目录中创建一个类路径,如下所示:/com.javaworld.mod2/com/javaworld/package2。添加一份名为Helolo的文件.java,其中包含下面的代码。

Hello.java

package com.javaworld.package2;

import com.javaworld.package1.Name;

public class Hello {

public static void main(String[] args) {

Name name = new Name();

System.out.println("Hello " + name.getIt());

}

}

代码在上面在中间,先定义包,然后导入com.javawolrd.package1.Name类。,这些元素的功能和以前一样。这些模块已经改变了如何使软件包可用于文件结构级别(而不是代码级别)。同样,我们应熟悉代码本身它只是创造一个类别,并使用一种方法来创造经典“ hello world”示例。

运行模块化Java示例

第一步是创建接收编译器输出的目录。/target在项目根目录中创建一个目录。在内部,为每个模块创建一个目录:/target/com.javaworld.mod1和/target/com.javaworld.mod2。

然后编译依赖模块并将其输出到/target目录。输入项目根目录:

Javac-dtarget/com.javaworld.mod1com.javaworld.mod1/module-info.java com.javaworld.mod1/com/javaworld/package/Name.java

这将导致源及其模块信息共同构建。

接下来是从属模块的生成。输入下面的命令。

javac --module-path target -d target/com.javaworld.mod2 com.javaworld.mod2/module-info.java com.javaworld.mod2/com/javaworld/package2//Hello.java

让我们详细看看上面的命令。它会的。module-将javac引入path参数。这使我们能够与之交谈--class-定义模块路径类似于path开关。

主类执行模块

java --module-path target -m com.javaworld.mod2/com.javaworld.package2.Hello

--module-path开关告诉Java使用/target目录作为模块根目录,即在哪里搜索模块。这个-m开关告诉我们Java的主要类别是什么。请注意,我们在其全名类名前添加了其模块。最后,我们将看到输出helo Java World。

鉴于之前的代码库对模块路径一无所知,你可能想知道以后怎么做Java 以模块前版本编写的Java程序在世界上运行。答案是Java 9设计是向后兼容的。然而,新的模块系统发生了很大的变化,我们可能会遇到问题,特别是在大型代码库中。

Java 在9之前运行代码库时,您可能会遇到两个错误:来自代码库和依赖项的错误。

以下命令可能有助于源于代码库的错误:jdeps。指向类或目录时,此命令将扫描依赖项和依赖项的模块。

对于依赖项造成的错误,可以希望所依赖的软件包有更新Java 9兼容版本。如果没有,只能找替代品。

以下是一个常见的错误:

How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

这是Java抱怨找不到一个类,因为它已经迁移到一个模块,无法查看使用的代码。这里描述了几个不同的复杂性和永久性解决方案。同样,如果您发现此类错误,请检查该项目。他们可能有Java 9构建供我们使用。

JPMS是一个相当大的变化,需要时间酝酿和发酵。我相信它将在未来的项目中得到广泛的应用。因为Java 8是一个长期的支持版本,所以如果没有必要,就不需要立即使用JPMS。尽管如此,从长远来看,旧项目需要迁移,新项目需要智能使用模块,这也是java发展的必然趋势。想了解更多最新的java前沿技术,可以观看本网站专业java视频课程哦,让我们学习吧同时,java也能跟上时尚技术的发展!