菜鸟为了巩固所写
目录
菜鸟为了巩固所写
一、概述
二、创建步骤
1、打开Intellij IDEA,创建一个名为MyJavaModuleApp的Java项目。
2、向示例项目中添加”模块描述符“文件
3、创建多模块的IntelliJ 项目
4、IntelliJ项目添加“新模块”对话框
解释1:模块声明与模块描述符
解释2:模块化的jar包
5、给MyLibModule模块添加可复用的代码
6、修改MyLibModule模块的module info.java
总结一下模块描述符的职责:
7、建立模块化之间的依赖关系
8、修改MyJavaModuleApp模块的module info.java
9、编写测试代码测试模块的调用
三、模块路径的概念
四、使用命令行运行模块后的Java程序
使用命令行运行模块实战演练
小结1:使用命令行运行模块化Java应用
小结2:Java模块编写的“基本准则”
区别两个性
默认情况下,模式可读性必须显示声明,不能传递
区分编译时和运行时
编辑
一、概述
这里讲解,如何使用IntelliJ IDEA创建一个简单的模块化Java应用。
这里需要知道,Intellij IDEA项目基本的构建单元也叫“模块(module)”,但这里的模块和JPMS中的“模块”不是一回事。Intellij中的模块是“构建单元”,它可以用于组织多种类型的开发资源。在实际开发中,可以使用Intellij模块来创建和生成JPMS模块。
二、创建步骤
1、打开Intellij IDEA,创建一个名为MyJavaModuleApp的Java项目。
每个IntelliJ IDEA 项目,都至少包容有一个模块,在本例中,最顶层的就是在这里起了名字的模块,可以将它看成是本项目的默认模块。
2、向示例项目中添加”模块描述符“文件
moduleinfo.java 文件应该位于IntelliJ 模块的 src 文件夹下。
module之后,跟着的就是模块名,由于所有 模块都位于一个全局命名空间中,因此,模块名称必须是唯一的,并且应该与模块文件夹的名字相同。
3、创建多模块的IntelliJ 项目
向IntelliJ 项目添加新模块:
- 一个 IntelliJ 项目可以包容多个模块,这在实际开发中非常常见。
- 通常会将代码等相关资源按照“职责”进行分类和汇总,把密切相关的东西都放在一起,保存在某个模块中,然后,再建立起各个模块之间的依赖关系。
- 达到一定规模的 Java 项目,不应该将所有的东西全部放在一个模块中。
4、IntelliJ项目添加“新模块”对话框
从IntelliJ IDEA 的“ New Module ”对话窗口可以看出,它的“模块”,是广义的模块,在一个 IntelliJ IDEA 项目中,可以创建 N 种类型的“模块”。
创建IntelliJ 模块的过程,与创建一个 IntelliJ 项目的过程几乎一样,这也说明了,你可以把 IntelliJ 模块,看成是一个 IntelliJ 的“子项目”。
模块创建好之后,采用与前面一样的方法,为新模块添加 module info.java 文件。
- 每个模块,都要有自己的module info.java 。
- 模块名称必须是唯一的。
解释1:模块声明与模块描述符
- moduleinfo.java 称为“ 模块声明( Module Declaration )文件 ”,它编译之后称为“ 模块描述符( Module Descriptor )。
- 模块声明文件必须存在于模块目录的根目录中。它与其他源文件一起编译成一个名为 module info .class 的二进制类文件 。
- 如果使用javac 一次性编译多模块的 Java 模块化项目 中,模块名称必须与包含模块描述符的目录名称相匹配。否则,编译器将拒绝编译并报告匹配错误。
解释2:模块化的jar包
- 包容有模块描述符的 JAR 包,称为模块化 JAR 包 。
- 模块描述符必须放在模块化JAR 包的根目录下,以方便 JPMS 识别。
- 模块化JAR 可以当成普通的JAR 来使用,你只需要把它放到类路径中去就行了。
5、给MyLibModule模块添加可复用的代码
向MyLibModule 模块中添加一个包,再添加一个类,然后里面写了一个 getInfo() 方法,返回一个“提示信息”。
模块化的应用中,所有的类,都应该归属于一个有名字的包。
6、修改MyLibModule模块的module info.java
在module info.java文件中,使用 exports 导出“ com.jinxuliang”包。
MyLibModule模块导出了一个包,此包中所有的公有类(本例为 MyPublicFunc现在就可以被其他模块所使用。简单地说,只要在 module info.java文件中导出一个包之后,包中所有声明为public 的类,就可以被外部所访问了。
在模块化的Java 应用中,如果没有在 module info.java 文件中导出包,那么,包中的类即使被声明为 public ,外界也无法使用它。
总结一下模块描述符的职责:
所谓“模块描述符”,其实就是放在module info.java文件中的内容编译之后的结果(是一个 .class 文件), 它描述了模块相关的重要信息:
- 模块的名字
- 本模块依赖于其他哪些模块的哪些包
- 本模块导出了哪些包和服务
- 本模块是否允许外界使用反射,读取特定包中的类型。
7、建立模块化之间的依赖关系
File---->Project Structure
点击+
选择3 模块依赖关系
点击确定
这里所建立好的依赖关系,其实是编译时的依赖关系,仅在编译时起作用。
8、修改MyJavaModuleApp模块的module info.java
- 使用 requires 语句导入本模块所需要调用的代码所在的模块。
- 如果本模块中也有代码需要供给外界使用,则可以用 exports 语句导出。
9、编写测试代码测试模块的调用
这里需要注意一个点,编写的测试代码也必须包含在一个软件包里面,否则无法运行。因为模块化的应用中,所有的类,都应该归属于一个有名字的包。
然后运行即可
由于本模块使用requires关键字导入了 MyLibModule 模块,所以可以使用它所导出的MyPublicFunc 类。
三、模块路径的概念
- 当编译和运行模块时,Java编译器和运行时使用模块描述符来解析正确的模块。模块是从模块路径(module path)中解析出来的,而不是类路径(class path)。类路径用于构建编译项目所需要用到的类型清单,而模块路径则可以看成是一个项目所引用的模块的清单。
- java命令行有一个module-path参数,用于指定模块路径。
- 当使用java命令运行一个模块时,它到模块路径中去查找所有模块,装载其模块描述符,通过读取模块描述符中给定的exports和requires等信息,就能构建出程序中用到的所有模块的依赖图。
给IntelliJ模块添加“模块依赖”时,其实是为了指定编译信息。真正的Java模块依赖信息,是放在module-info.java中的。
四、使用命令行运行模块后的Java程序
使用命令行运行模块实战演练
操作如图
像我的操作就是
-m 是“ module ”的简写。
就可以运行成功。而要运行的MyFirstModuleApp.class所在的文件夹是这样的
小结1:使用命令行运行模块化Java应用
- --module path ,简写为-p :代表依赖的模块保存的位置
- --module ,简写为 -m: 表示要启动的初始模块,如果此模块中没有定义程序入口点,则可以采用“模块名 主类”的方式指定程序入口点。
小结2:Java模块编写的“基本准则”
区别两个性
可读性(readability):如果A requires B,我们就说:“模块B对于模块A来说,是可读的。读取其他模块意味着可以访问其导出包中的类型。”
可访问性: