JAVA-初始JAVA模块化开发

菜鸟为了巩固所写

目录

菜鸟为了巩固所写

一、概述

二、创建步骤

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来说,是可读的。读取其他模块意味着可以访问其导出包中的类型。”

        可访问性:

默认情况下,模式可读性必须显示声明,不能传递

区分编译时和运行时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34196.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java 中tableaw 实战教程

java中tableaw库通过简单的API实现过滤、连接、绘制和操作表格数据。支持CSV,数据库,Excel等数据源。 安装依赖 tableaw是用于分析表格数据的开源Java库,构建在Java 8流之上。它可以从GitHub下载,也可以作为Maven或Gradle项目的…

力扣206. 反转链表题解

文章目录 题目描述:试析:1.迭代法2.递归法3.双指针法4.数组法 力扣206. 反转链表 题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] …

Jdk21引入jsoup运行报错:java.lang.NoClassDefFoundError

文章目录 背景抽象类中代码问题分析尝试最终解决 背景 在富文本编译内容中,有些文件是存储到阿里云 oss 中的,所以链接做 STS 临时访问有时效性,每次返回的时候,需要通过STS来签名替换掉其中的链接访问,所以用到 jsoup…

Kafka 物理存储机制

优质博文:IT-BLOG-CN 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用效果。Kafka的基…

【Linux】内核打印函数`printk`详解

在Linux内核开发过程中,printk是一个极其重要的函数,用于将信息输出到内核日志中。通过printk,开发者可以在内核中打印调试信息、错误信息以及其他类型的日志,这对于诊断问题、追踪执行流程以及监控系统状态都非常有帮助。本文将详…

校园失物招领借助 SpringBoot:塑造校园互助寻物新风尚

3系统分析 3.1可行性分析 开发者在进行开发系统之前,都需要进行可行性分析,保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该校园失物招领系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识…

SpringCloud微服务学习笔记(二)_Docker

文章目录 docker拆封原则docker在linux上的安装部署mysql部署mysql命令解读 常见命令数据卷挂载以宿主目录自定义挂载Dockerfile语法自定义镜像容器网络互联部署java应用,后端部署前端DockerCompose(快速部署) docker 简化环境配置流程 单体架构 架构简单部署成本低团队协作成…

02.ABAP工作台介绍

总学习目录请点击下面连接 SAP ABAP开发从0到入职,冷冬备战-CSDN博客 目录 1.知识库和对象浏览器 目的: 知识库有那些对象 知识库对象结构 如何去知识库查找对象 第一个是知识库信息系统 2.知识库和对象浏览器操作 3.开发abap程序 创建新的AB…

【Axure视频教程】中继器表格——筛选后的条件判断

今天教大家在Axure制作中继器表格筛选以及筛选后条件交互的原型模板,我们可以在输入框里输入员工姓名,点击查询按钮后可以筛选出对应的数据,筛选后会进行条件判断,如果筛选不到任何数据,就会显示提示弹窗。这个原型模板…

华为ensp中nat server 公网访问内网服务器

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月15日17点30分 💯趣站推荐💯 前些天发现了一个巨牛的🤖人工智能学习网站,通俗易懂,风趣幽默,…

Redis 可以代替 MySQL 作为数据库吗?

当使用Redis作为数据库时,以下是一些基本的代码示例 展示了如何使用Redis进行数据存储、读取和更新: 1.连接到Redis服务器: import redis# 创建Redis连接 r redis.Redis(hostlocalhost, port6379, db0)2.存储和获取数据: # 存…

C语言(一维数组练习)

键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 #include <stdio.h>int main(int argc,char *argv[]) {int i,j,tmep;int arr[10];printf("请输入10个测试整数&#xff1a;\n");int lensizeof(arr)/sizeof(arr[0]);for(i0;i<len;i){scanf(&q…

【C++】动态内存管理

目录 一、C/C的内存分布 &#x1f354;内存的划分 &#x1f35f;C语言动态内存管理方式 &#x1f32e;C动态内存管理方式 二、new 和 delete &#x1f354;new 和 delete 操作自定义类型 &#x1f35f;operator new 与 operator delete 函数 &#x1f32e;面试题&#x…

开发者如何使用GCC提升开发效率Opencv人脸检测

阅读此篇前请务必阅读以下两篇&#xff0c;不然你可能都不会安装环境 文章目录 简单人脸识别第三方模型集成人脸检测 简单人脸识别 使用Opencv自带的haarcascade_frontalface_alt2模型&#xff0c;始终差一个人没标出来&#xff0c;很尴尬 报错找不到模型 EveryThing搜索一遍…

梯度提升树(GBDT)与房价预测案例

文章目录 什么是梯度提升树&#xff08;GBDT&#xff09;&#xff1f;核心思想GBDT 的特点 梯度提升树的应用案例&#xff1a;房价预测场景描述步骤详解代码详情 详细代码讲解1. 导入必要的库2. 设置中文字体支持3. 可视化真实值与预测值4. 可视化预测误差分布5. 代码的运行效果…

VMware详细安装教程

1.获取安装包 官网下载地址&#xff1a; https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 2.安装过程 双击安装包进行安装 接受许可协议 选择安装路径&#xff08;c 盘空间大的话&#xff0c;建议保持默认&#xff09; 用户体验设置&…

STM32 软件模拟I2C 操作时序图

m24c02芯片手册可以查看时序图 起始和停止信号 写一个字节&#xff1a; 主发送起始-》 CPU 芯片内部的I2C 控制器&#xff08;片上外设主设备&#xff09;-》发送起始信号-》发送设备地址-》EEPROM&#xff08;从设备&#xff09;返回回应信号-》主发字节起始地址-》从回应-》…

2024年软件测试面试题(800道)【附带答案】持续更新...

新的一年又到了立flag的时候&#xff0c;今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#…

jdk1.7 发送post请求

所需依赖为 引入依赖为 import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod;特别说明 tmpString为json对象 System.out.println("tmpString " tmpString);// 处理发送https 错误问题SSLContext context …

鸿蒙音乐播放器(超详细)

基于API9的音乐播放器&#xff0c;可播放&#xff0c;暂停&#xff0c;上&#xff0c;下一首歌曲切换等功能 文章目录 1.效果展示 2.首页 3.播放页 注&#xff1a;需要使用模拟器或真机调试运行 一、效果展示 1.首页样式&#xff1a; 2.播放样式&#xff1a; 二、首页功能代码…