当前位置: 首页 > news >正文

Java中的模块(Module)入门介绍

Java中的模块(Module)入门介绍

在Java 9版本中Java 语言引入了一个非常重要的概念:模块(module)。module引入了Java代码分组的另一个级别。每个module都包含许多子package(包)。模块是一组密切相关的包和资源以及一个新的模块描述符文件。

Java文件是按照Java包的结构组织起来的,Java中的包通常包含相关的类,映射的实体概念是目录(directory),Java文件对应的目录结构层次要和包的结构层次一致。编译后的.class文件也需要按照包结构存放。Java 9 引入的模块(Module)是在Java包(package)的基础上又引入的一个新的抽象层。

Java中的package是Java中的基本组织单位, 每个包中包含Java类和接口文件。Java 9 引入的模块(Module)是在Java包(package)的基础上又引入的一个新的抽象层,是一组唯一命名(uniquely named)、可重用的相关包(packages)、资源(如图像和XML文件)和一个模块描述符(module descriptor)。模块类似于jar文件,因为两者都是一组包。两者之间的区别在于,模块包含元数据,即配置信息。模块的配置信息在一个名为 module-info.java 的特殊文件中指定。

模块描述符包含以下信息:

模块的名字——模块名称的声明

模块的依赖关系

它显式地向其他模块提供的包

它提供的服务

它所使用的服务

允许反射到的其他模块

模块名称的声明

一个模块的自描述表现在它的模块声明中,它是java程序语言中的一个新的结构,最简单的可能的模块声明仅仅是指定模块的名字,如:

module com.foo.bar { }

其中,com.foo.bar是模块名称。

使用模块化编程的一个java项目通常含三个子目录:lib,mods和src,其中src目录用于保存源代码; mods目录将已编译的代码保存在展开的目录层次结构中;在编译源代码之后,将其打包成一个模块化的JAR并将其存储在lib目录中。 可以使用模块化JAR来运行程序,也可以将模块JAR提供给可以运行程序的其他开发人员。

下面是含有两个模块“ common.widget”和“ data.widget”的项目示意,放置在文件夹“src”下。文件“ module-info.java”将放置在每个模块的根文件夹下。

其文件及目录格式示意如下:

模块命名规则类似于我们命名包的方式(允许点)。模块名外观和包名类似, 但和包不同,模块并不保存在对应的目录下,而是保存在与模块同名的目录下,比如common.widget模块保存在common.widget目录下,而不是common\widget目录下。模块名需要和所在的子目录同名的吗?建议相同(方便用javac编译多个模块,将有一些选项可一次编译多个模块的源代码)但非必须。上图示例中相同。

模块名和包名需要相同吗?否, 也可以选择所需的任何其他包名称。上图示例中就不相同,下面的例子模块名和包名称相同。

创建一个 com.test 的模块。

第一步

创建文件夹 D:>JAVA\src,然后在该目录下再创建与模块名相同的文件夹 com.test。

第二步

在 D:>JAVA\src\com.test 目录下创建 module-info.java 文件,代码如下:

module com.test { }

这一步我们创建了 com.test 模块。

第三步

在模块中添加源代码文件,在目录 D:>JAVA\src\com.test\com\test 中创建文件 Java9Tester.java,代码如下:

package com.test;

public class Java9Tester {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

第四步

创建文件夹 D:>JAVA\mods,然后在该目录下创建 com.test 文件夹,编译模块到这个目录下。操作如下:

打开cmd,先使用cd /d D:\JAVA,切换到D:\JAVA目录,再输入如下命令编译模块

javac -d mods/com.test src/com.test/module-info.java src/com.test/com/test/Java9Tester.java

第五步

执行模块,输入如下命令查看输出结果:

java --module-path mods -m com.test/com.test.Java9Tester

其中,module-path 指定了模块所在的路径。

-m 指定主要模块。

输出:

Hello World!

第四步和第五步,可参见下图:、

此示例比较简单,目的是让新手对如何使用模块有个感性认识。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2D图像打包成一张图片
  • w30-python02-pytest入门
  • 二分查找代码详解
  • 【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)
  • IP协议+网络层
  • UDP程序设计
  • 使用 WebSocket 实现实时聊天
  • 大语言模型赋能设施农业:透过“智慧大脑“看智能环境调控
  • VUE3——001(03)、开发环境配置(node.js/mvn/java/ngix/tomact/vue3)
  • (leetcode学习)236. 二叉树的最近公共祖先
  • VAE、GAN与Transformer核心公式解析
  • 解决git每次push代码到github都需要输入用户名以及密码
  • 如何在 Windows 上安装并配置 VNC 远程连接树莓派,并结合Cpolar实现公网远程访问
  • Oracle(21)什么是聚集索引和非聚集索引?
  • SpringBoot整合SSE技术详解
  • Angularjs之国际化
  • centos安装java运行环境jdk+tomcat
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Intervention/image 图片处理扩展包的安装和使用
  • JS+CSS实现数字滚动
  • JWT究竟是什么呢?
  • mysql外键的使用
  • Ruby 2.x 源代码分析:扩展 概述
  • vuex 笔记整理
  • 从零搭建Koa2 Server
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于springcloud Gateway中的限流
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 那些年我们用过的显示性能指标
  • 前端技术周刊 2019-01-14:客户端存储
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • MPAndroidChart 教程:Y轴 YAxis
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​secrets --- 生成管理密码的安全随机数​
  • #《AI中文版》V3 第 1 章 概述
  • #Z0458. 树的中心2
  • (2)(2.10) LTM telemetry
  • (NSDate) 时间 (time )比较
  • (回溯) LeetCode 131. 分割回文串
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)setTimeout 和 setInterval 的区别
  • (转)程序员疫苗:代码注入
  • (转)负载均衡,回话保持,cookie
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .axf 转化 .bin文件 的方法
  • .net core 6 集成和使用 mongodb
  • .NET 解决重复提交问题
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET多线程执行函数
  • .NET学习教程二——.net基础定义+VS常用设置
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Import注解详解
  • @property括号内属性讲解
  • @基于大模型的旅游路线推荐方案