Java module-info模块系统

开源项目SDK:https://github.com/mingyang66/spring-parent
个人文档:https://mingyang66.github.io/raccoon-docs/#/

从Java9开始引入了模块系统(Jigsaw项目),用于更好的管理代码依赖和封装性。模块系统允许你定义模块,并指定模块之间的依赖关系,以及哪些包应该被到处或暴露给其它模块。

一、Java模块

假设我们有两个模块:module-a和module-b,下面我们定义源代码和模块描述文件module-info.java

# 目录结构
my-project/
├── module-a/
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/
│   │               └── example/
│   │                   └── modulea/
│   │                       └── ClassA.java
│   └── module-info.java
└── module-b/├── src/│   └── main/│       └── java/│           └── com/│               └── example/│                   └── moduleb/│                       └── ClassB.java└── module-info.java
  1. 在每个模块的根目录下创建module-info.java文件,这个文件定义了模块名称、到处的包级所需的依赖。

module-a/module-info.java

// 声明模块
module module.a {exports com.example.modulea;
}

module-b/module-info.java

// 声明模块
module module.b {requires module.a;exports com.example.moduleb;
}
  • requires:依赖其它模块导出的包;
  • exports:导出指定的包,供其它模块依赖使用;
  • module module.b声明了一个名为module.b的模块;
二、模块中未定义module-info.java

模块中如果未定义module-info.java,那么我们在自己的项目中通过module-info.java定义依赖的时候是否可以使用?

答案:是可以的,如依赖的包名为a-b-c-starter,则系统自动会解析成模块名为a.b.c.starter,此模块中的所有包都导出
三、模块module-info.java定义模块名有没有指定的规则

官方没有明确指定具体的命名规则,只要遵从通用准则一般不会有问题,如:唯一性、建议小写字母、点号分割、允许字母数字混合。

反例:druid-spring-boot-3-starter在版本1.2.23版本及之前是没有定义module-info.java的,模块名会本默认解析为druid.spring.boot.3.starter,这样就是一个错误的模块名,会报如下错误提示:

package 'com.alibaba.druid.spring.boot3.autoconfigure.stat' is declared in module with an invalid name ('druid.spring.boot.3.starter')
四、模块系统支持单元测试

对于包含module-info.java的模块的单元测试,需要使用支持java模块系统的测试框架和构建配置,一下是设置单元测试的步骤。

  • 在pom.xml文件中配置JUnit5的依赖:
        <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.xx.xx</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.xx.xx</version><scope>test</scope></dependency>
  • 配置maven surefire插件,确保可以运行单元测试
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.x.x</version><configuration><!-- 如果需要,添加模块路径配置 --></configuration></plugin></plugins>
</build>
  • 在在路径module/src/test/java/下新建module-info.java文件
module oceansky.sensitive.test {requires oceansky.sensitive;requires org.junit.jupiter.api;requires org.junit.platform.engine;requires org.junit.platform.commons;opens com.emily.infrastructure.sensitive.test.entity;exports com.emily.infrastructure.sensitive.test;
}

以上就是配置模块系统单元测试的简单步骤,接下来就可以使用mvn clean package或mvn test命令来执行单元测试了。

五、opens指令

module-info.java文件中有一个opens指令,如下:

module your.module.name {opens com.emily.infrastructure.sensitive.test.entity; //开放给所有模块opens com.oceansky.logger to oceansky.core; //开放给特定的模块
}
  • opens指令意味着这个模块开放了com.emily.infrastructure.sensitive.test.entity包,允许其它模块通过反射来访问这个包中的类、方法或字段,即使这些成员不是公共的。
  • opens指令通常用于框架或库,他们需要在运行时通过反射来访问用户模块中的非公共成员,而又不想破话封装性,即不希望将包导出(exports)给所有模块。
  • module-info.java文件应该放在模块的源代码的根目录下,与其他java源文件一起编译。
六、uses指令

uses指令在module-info.java中用于声明模块希望使用的服务接口,这些服务接口不必由当前模块提供,但他们将由当前模块通过服务加载机制来使用,如下:

module my.module {requires java.sql;uses java.sql.Driver;
}

这意味着my.module不提供java.sql.Driver的实现,但是可以通过服务加载机制(ServiceLoader)来查找和使用这些实现。

七、provides … with …指令

provides …with…是module-info.java中的一个指令,用于声明模块提供的服务,具体来说,它声明了模块提供哪些服务接口的实现,即:SPI的具体实现类

示例如下:

open module oceansky.logger {requires ch.qos.logback.classic;requires ch.qos.logback.core;requires org.slf4j;uses com.emily.infrastructure.logback.configuration.context.Context;provides com.emily.infrastructure.logback.configuration.context.Context with com.emily.infrastructure.logback.configuration.context.impl.LogbackContext;exports com.emily.infrastructure.logback;exports com.emily.infrastructure.logback.factory;exports com.emily.infrastructure.logback.common;exports com.emily.infrastructure.logback.configuration.context;
}

provides com.emily.infrastructure.logback.configuration.context.Context with com.emily.infrastructure.logback.configuration.context.impl.LogbackContext指令声明了模块oceansky.logger提供了Context接口的实现类LogbackContext,必须这样指定SPI服务,否则其它模块引用此服务的时候SPI无法加载实现类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-爬虫篇-爬取百度贴吧,段友之家的图片和视频

#!/usr/bin/env python # -*- coding: utf-8 -*-""" 爬取百度贴吧&#xff0c;段友之家的图片和视频 author: cuizy time&#xff1a;2018-05-19 """import requests import bs4 import osdef write_file(file_url, file_type):""&quo…

02 Shell编程之条件语句

1、条件测试操作 要使Shell脚本程序具备一定的智能&#xff0c;面临的第一个问题就是如何区分不同的情况以确定执行何种操作。 例如&#xff0c;当磁盘使用率超过95%时&#xff0c;发送告警信息&#xff1b;当备份目录不存在时&#xff0c;能够自动创建&#xff1b; 当源码编…

深入解析:银行信贷业务办理的核心流程

一、引言 银行信贷管理是一个复杂而严谨的过程&#xff0c;它涉及从贷款申请到贷款归还的每一个环节。通过科学、审慎、合规的信贷管理&#xff0c;银行能够确保资金的安全性&#xff0c;降低风险&#xff0c;并提供高效的信贷服务。本文将详细揭秘银行信贷业务办理的主要业务流…

Qt之文件操作(QFile、QFileInfo、QTemporaryFile)

文章目录 前言QFile如何使用 QFile QFileInfo如何使用 QFileInfo QTemporaryFile如何使用 QTemporaryFile QFile常用函数QFileInfo常用函数QTemporaryFile常用函数总结 前言 在开发 Qt 应用程序时&#xff0c;我们经常需要进行文件操作&#xff0c;如读取文件、写入文件、获取…

超大cvs文件导入MySQL

1 XXX.cvs 太大 使用cvs拆分HugeCSVSplitter_jb51工具进行拆分&#xff0c;Line Count 设置为1,000,000 注意&#xff1a;1 拆分后除第一个子cvs文件含有标题外&#xff0c;其他的子文档都不含有标题行&#xff1b; 2 后一个文档的第一行为前一个文档的…

Automa 插件

插件下载 (Version:1.18.1)&#xff1a;https://download.csdn.net/download/code_stream/89467293视频教程1&#xff1a;https://www.bilibili.com/video/BV19VTueJESA/视频教程2&#xff1a;https://www.bilibili.com/list/36751867

小抄 20240618

1 有些人只要看到一件事有难度&#xff0c;内心就会觉得自己做不到&#xff0c;很容易放弃。 有难度和做不到&#xff0c;是两回事。 让你不做任何改变&#xff0c;银行卡凭空多出一百万&#xff0c;这个做不到。 让你定个十年计划&#xff0c;凭个人能力存到一百万&#xf…

MyBatis系列六: 映射关系多对一

动态SQL语句-更复杂的查询业务需求 官方文档基本介绍映射方式配置Mapper.xml的方式-应用实例注解的方式实现-应用实例课后练习 官方文档 文档地址: https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html 基本介绍 ●基本介绍 1.项目中多对1的关系是一个基本的映射关系, 也可…

ITSS信息技术服务标准是什么?

ITSS运维模型规定了各级运维服务能力成熟度在管理、人员、过程、技术和资源方面应满足的要求。适用于运维服务供方建立、保持和改进运维服务能力&#xff0c;也适用于评价供方运维服务能力。 运维服务能力成熟度模型按运维服务组织能力建设和管理定义了逐步进化的四个等级&…

领先GPT-4o:Anthropic 推出新一代模型 Claude 3.5 Sonnet|TodayAI

Anthropic&#xff0c;全球领先的人工智能实验室之一&#xff0c;近日发布了其最新的人工智能模型——Claude 3.5 Sonnet。该模型不仅速度更快&#xff0c;成本更低&#xff0c;而且在多个关键任务上的表现超过了其前代模型 Claude 3 Opus。 更强的视觉功能与幽默感 Claude 3…

Python基础教程(二十九):operator模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Upload-Labs-Linux1 使用 一句话木马

解题步骤&#xff1a; 1.新建一个php文件&#xff0c;编写内容&#xff1a; <?php eval($_REQUEST[123]) ?> 2.将编写好的php文件上传&#xff0c;但是发现被阻止&#xff0c;网站只能上传图片文件。 3.解决方法&#xff1a; 将php文件改为图片文件&#xff08;例…

【代码随想录算法训练Day42】LeetCode 1049.最后一块石头的重量II、LeetCode 494.目标和、LeetCode 474.一和零

Day42 动态规划第四天 LeetCode 1049.最后一块石头的重量II dp数组的含义&#xff1a;容量为j的背包能装的物品的最大价值&#xff08;最大重量&#xff09;为dp[j]。 递推公式&#xff1a;dp[j]max(dp[j],dp[j-weight[i]]value[i]) 初始化&#xff1a;dp[0]0,dp[j]0。 遍历顺…

白嫖游戏指南,Epic喜加二:《Freshly Frosted》《Rumble Club》

前言 Epic喜加二&#xff1a;《Freshly Frosted》《Rumble Club》《Freshly Frosted》简介&#xff1a; 《Rumble Club》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&…

IP SSL证书使用率大幅度提升

IP SSL证书的使用人数在增长&#xff0c;这一趋势背后有几个推动因素&#xff1a; 1.网络安全意识提升&#xff1a;随着网络安全事件频发&#xff0c;用户和企业对数据保护的重视程度日益增加。IP SSL证书能为基于IP地址直接访问的网站或服务提供加密&#xff0c;有助于防止数据…

等保测评练习卷5

等级保护初级测评师试题5 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 启用安全增强型Linux的permissive模式&#xff0c;违反SElinux规则的行为只会被记录到日志中 (T ) p106 除管理员用户外&…

没等来百度惊艳的All in AI,却等来了国产之光的盘古大模型 5.0

6月21日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在广东东莞正式开幕。盘古大模型5.0的更新&#xff0c;也是此次HDC2024的另一项重头戏。在过去的一年中&#xff0c;盘古大模型正在疯狂向各行各业渗透。 此次&#xff0c;华为方面展示了他们在具身智能、医…

七连发吴谨言专访揭秘

七连发&#xff01;吴谨言专访揭秘&#xff0c;薛芳菲魅力再升级在娱乐圈的繁星中&#xff0c;总有那么一些独特的光芒&#xff0c;她们用才华和魅力照亮前行的道路。近日&#xff0c;备受瞩目的“六公主”平台连续发布了七条关于吴谨言的专访&#xff0c;引发了广大网友的热烈…

Java正则魔法:解锁语法深处的奥秘

1. 引言 深入理解Java正则表达式的语法是提升编程效率和文本处理能力的关键。下面将详细探讨Java正则表达式的语法,并揭示其背后的奥秘。 2. 元字符与特殊字符 .:匹配除了换行符之外的任何单个字符。\d:匹配任何数字,等价于[0-9]。\D:匹配任何非数字字符。\w:匹配任何字…

Java学习笔记(一)Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质、课后练习

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质还有几道课后练习详细介绍以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …