在Java 9中,我们如何显示所有模块名称?

Java 9模块介绍

Java 9中引入了模块系统的概念,对于像Java平台这样庞大的软件系统而言,单一的类路径方式已经无法满足日益增长的需求。模块即为一系列功能的组合,每个模块都有自己的接口,内部实现和依赖关系,可以管理和隔离模块之间的依赖关系,使得软件系统具备更好的可扩展性、可重用性和安全性。

在Java 9中,系统内置的所有模块将被组织成模块层。每个模块都有一个名称,使用“点分隔的名称”(dotted name)进行标识。例如,java.base模块就是Java标准库中的模块。在Java 9和更高版本中,默认情况下,所有Java源代码都会被分配到一个模块中,该模块名称与源文件的目录层次结构相匹配。

Java 9模块系统的优点

Java 9的模块系统提供了以下的优点:

更好的可扩展性:将系统拆分为若干个小模块,降低了模块之间的耦合度,系统变得更易于维护和扩展。

更好的可重用性:模块机制可以使Java应用程序更好地重用。

更好的安全性:Java 9模块系统可以保证Java应用程序的安全性,阻止了一些不必要的访问权限。

更快的启动速度:模块系统使得只需要加载所需的模块,而不是整个classpath,减少了启动时间。

Java 9中模块的命名规则

Java 9中的模块名称应该是“点分隔的名称”(dotted name),例如:java.util、java.lang等。模块名称也可以是未来版本的Java SE平台中定义的标准模块 。

在Java 9中显示所有模块名称

在Java 9中,要显示所有模块名称,可以使用命令行工具jdeps 。它是一个用于分析Java文件中的类和依赖的工具。可以使用以下命令列出当前JVM中的所有模块:

jdeps --list-modules

运行上述命令后,将得到输出类似于以下内容的结果:

java.base

jdk.accessibility

jdk.aot

jdk.attach

jdk.charsets

jdk.compiler

jdk.crypto.cryptoki

jdk.crypto.ec

jdk.crypto.mscapi

jdk.dynalink

jdk.editpad

jdk.hotspot.agent

jdk.httpserver

jdk.incubator.foreign

jdk.incubator.jmodhttpserver

jdk.incubator.jpackage

jdk.incubator.jshell

jdk.internal.ed

jdk.internal.jvmstat

jdk.internal.le

jdk.internal.opt

jdk.internal.vm.ci

jdk.jartool

jdk.javadoc

jdk.jcmd

jdk.jconsole

jdk.jdeps

jdk.jdi

jdk.jdwp.agent

jdk.jfr

jdk.jlink

jdk.jpackage

jdk.jshell

jdk.jsobject

jdk.jstatd

jdk.localedata

jdk.management

jdk.management.agent

jdk.management.jfr

jdk.management.resource

jdk.net

jdk.nio.mapmode

jdk.nispa.jni

jdk.pack

jdk.rmic

jdk.scripting.nashorn

jdk.scripting.nashorn.shell

jdk.sctp

jdk.security.auth

jdk.security.jgss

jdk.snmp

jdk.unsupported

jdk.unsupported.desktop

jdk.xml.dom

jdk.zipfs

从上面的结果中,我们可以看到JDK中已经包含了许多模块,例如,java.base、jdk.compiler、jdk.crypto等模块。JDK模块化不仅仅将类库从JDK中抽出,而是通过模块系统来管理类库,这样可以使得运行java程序更加高效,同时保证对开发人员改变方式的方便。

使用模块化系统编写Java程序

在Java 9中,可以使用模块化系统来编写更灵活、可维护的Java程序。下面是一个使用Java 9模块化系统的示例Java类:

module com.example.myapp {

requires java.base;

requires spring.core;

requires spring.context;

requires spring.web;

exports com.example.mypackage;

}

这里定义了一个名为com.example.myapp的模块。模块的定义非常清晰,它显式地依赖了四个模块:java.basespring.corespring.contextspring.web。由于需要向其他模块公开它的com.example.mypackage包,所以使用exports指令来声明它是“导出的包”。

值得注意的是,requires指令并不是直接指定依赖的jar包,而是指定所依赖模块的名称。模块的定义并不依赖于具体的包结构,只需要声明模块所需的其他模块即可。

开发和编译Java模块

首先,需要在源文件中定义模块描述,例如,下面是一个简单的例子:

module com.example.myapp {

requires java.base;

}

为了编译这个模块,我们需要使用javac编译器。在我们编译MyApp.java源文件时,我们还需要使用--module-path参数来指定其他所需模块的路径:

javac --module-path /path/to/required/modules --module-source-path src/com.example.myapp -d out src/com.example.myapp/com/example/myapp/MyApp.java

在上面的示例中,--module-source-path标志指定了模块源文件所在的目录,-d选项指定了编译输出目录。为了能够在模块内正确的引用其他模块,必须指定--module-path参数,其中包含你要使用的所有模块的路径。

在Java 9中,命令jar 工具也被更新以支持模块化。它有一个新的“-C”选项,其中,-C指定了要添加到JAR文件中的目录,例如:

jar --create --file your.jar --module-version 1.0 -C out .

在这个例子中,--create选项指示 jar 工具进行创建操作。 --file 选项指定了要创建的 JAR 文件的名称和路径。 --module-version 选项指定了模块的版本号。最后的-C out告诉 jar 工具到out目录中查找文件。

模块路径

在模块化系统中,Java运行时使用的是模块路径(module path)而不是类路径(class path)。模块运行时的依赖关系由module-info.java提供的requires指令定义的依赖性来建立。如果存在模块路径,则所有的必需模块必须在模块路径上而不是在类路径上进行定位。同样,类也必须声明在哪个模块中定义,通过在 module-info.java 文件中使用provides指令和uses指令声明可提供服务和使用哪些服务。

总结

Java 9模块化系统使得开发人员可以更好地控制Java应用程序所依赖的库,更好地设计和编写Java应用程序。在Java 9中,引入了模块层和模块抽象的概念,要列出所有可用模块,可以使用jdeps工具的--list-modules选项。通过模块化系统编写Java应用程序时,可以使用模块化描述module-info.java文件。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签