关于Java 9中的模块(Module)系统,这里为您整理了完整的攻略。请您仔细阅读以下文章。
什么是Module系统
Java 9中引入了一种新的概念——Module系统,来管理和组织代码。作为Java9中最重要的新特性之一,模块化系统的引入为我们开发、维护和交付大规模的Java应用程序提供了更多的选择和优化。
为什么引入Module系统
随着时间的推移,Java应用程序的规模越来越大,程序之间的依赖关系越来越错综复杂。在没有模块化的情况下,一个大型应用程序会有成千上万的类存在,同时还需要依赖于大量的第三方库维护才能正常工作。
这种依赖结构的复杂性和不确定性在很多时候会给开发和维护带来很大的困难。在这种情况下,Modular系统的引入就具有了很重要的意义。
什么是Module
一个Java Module是一个新的抽象概念,它在设计上避免了传统的包系统的问题。一个模块(Module)定义了一组功能,这些功能通常是在单独的源代码树中分开实现的,并且通常会结合一个版本号的概念。
一个模块(Module)被称为一组包(Package),但是,不像传统的Java包,它是一个命名空间,可以分配到一个或多个模块。
Module系统的优点
Module系统最大的优点在于它的封装性和隔离性。在模块化编程中,我们的应用程序只会依赖于它使用的模块,而其他的模块因为被封装起来而无法直接访问,这样减少了代码之间的耦合性,不仅保证了程序的稳定性和可维护性,也提升了代码的可读性和可理解性。
模块化开发需要了解的知识点
在使用Module系统前,我们需要了解一些相关知识点。
模块(Module)的声明和定义
模块(Module)的声明包括模块名称、包含的包、所需的模块和提供的服务等信息的声明。
声明可以放在一个module-info.java文件中,它位于根源代码目录的顶层目录下。
// 单个module的module-info.java
module com.example.demo {
exports com.example.demo;
}
// 多个module的module-info.java
module com.example.demo {
requires org.apache.commons.lang3;
requires org.apache.commons.codec;
exports com.example.demo;
}
模块(Module)的编译和打包
使用Module系统时,我们需要通过编译器对模块化代码进行编译,并将其打包成一个jar文件。
编译命令:
javac -d outdir [--module-source-path src] src/pkg/module-info.java src/pkg/module-src-file.java
打包命令:
jar --create [--file filename] [--module-version version] [--main-class classname] -C classes .
模块(Module)的依赖和导出
在使用Module系统时,模块之间的依赖显得尤为重要。Java为模块之间的依赖提供了两种方式:requires和exports。
- requires:表示一个模块需要其他模块提供的功能。
- exports:表示一个模块允许其他模块访问自己的功能。
模块(Module)的可见性
在Module系统中,一个模块对其他模块的可见性和可用性取决于它的导出和依赖关系。一个模块定义的package只能被它exports的模块访问。
示例演示
下面通过两个实例,快速了解Java 9 Module系统的基本使用。
示例一:创建Module
.
├── com.example.demo
│ ├── module-info.java
│ └── com/example/demo/HelloWorld.java
module-info.java:
module com.example.demo {
exports com.example.demo;
}
HelloWorld.java:
package com.example.demo;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
编译:
javac -d mods/com.example.demo src/com.example.demo/module-info.java src/com.example.demo/com/example/demo/HelloWorld.java
打包:
jar -c -f mods/com.example.demo.jar -C mods/com.example.demo .
运行:
java -p mods -m com.example.demo/com.example.demo.HelloWorld
输出:
Hello, World!
示例二:模块依赖
.
├── com.example.demo
│ ├── module-info.java
│ ├── com/example/demo/HelloWorld.java
│ └── com/example/demo/service/HelloService.java
├── com.example.demo.api
│ ├── module-info.java
│ └── com/example/demo/api/IHelloService.java
├── com.example.demo.app
│ ├── module-info.java
│ └── com/example/demo/app/HelloApplication.java
└── lib
└── apache-commons-lang3-3.8.1.jar
com.example.demo/module-info.java:
module com.example.demo {
requires com.example.demo.api;
requires org.apache.commons.lang3;
exports com.example.demo;
exports com.example.demo.service;
}
com.example.demo/com/example/demo/HelloWorld.java:
package com.example.demo;
import com.example.demo.service.HelloService;
public class HelloWorld{
public static void main(String[] args){
HelloService service = new HelloService();
System.out.println(service.getMessage());
}
}
com.example.demo.service/HelloService.java:
package com.example.demo.service;
public class HelloService {
public String getMessage() {
return "Hello Java 9 Module System!";
}
}
com.example.demo.api/module-info.java:
module com.example.demo.api {
exports com.example.demo.api;
}
com.example.demo.api/com/example/demo/api/IHelloService.java:
package com.example.demo.api;
public interface IHelloService {
String getMessage();
}
com.example.demo.app/module-info.java:
module com.example.demo.app {
requires com.example.demo;
requires com.example.demo.api;
}
com.example.demo.app/com/example/demo/app/HelloApplication.java:
package com.example.demo.app;
import com.example.demo.api.IHelloService;
import com.example.demo.service.HelloService;
public class HelloApplication {
public static void main(String[] args) {
IHelloService helloService = new HelloService();
System.out.println(helloService.getMessage());
}
}
编译:
javac --module-source-path src -d out $(find . -name "*.java")
打包:
jar --create --file mods/com.example.demo.jar --module-version 1.0 -C out/com.example.demo .
jar --create --file mods/com.example.demo.api.jar --module-version 1.0 -C out/com.example.demo.api .
jar --create --file mods/com.example.demo.app.jar --module-version 1.0 --main-class com.example.demo.app.HelloApplication -C out/com.example.demo.app .
运行:
java -p mods -m com.example.demo/app
输出:
Hello, World!
两个示例都是非常简单的,但是它们展示了Java 9中Module系统的基本用法。Java 9的Module系统是Java生态系统的一个重要里程碑,熟练掌握它可以为开发大型Java应用提供更多的便利。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 9 中的模块Module系统 - Python技术站