0

0

了解Java的模块化系统 (Project Jigsaw)_JDK 9及以上版本的环境影响

P粉602998670

P粉602998670

发布时间:2026-02-20 08:52:45

|

462人浏览过

|

来源于php中文网

原创

module-info.java必须位于src/main/java/根目录下,不可置于任何包路径内,否则编译报错“module info file not found”。

了解java的模块化系统 (project jigsaw)_jdk 9及以上版本的环境影响

模块声明文件 module-info.java 必须放在源码根目录

Java 模块系统要求每个模块必须有且仅有一个 module-info.java,它不能放在 src/main/java/com/example/ 这类包路径下,而必须和 java 包同级——即位于 src/main/java/module-info.java。否则编译器直接报错:error: module info file not found

常见错误现象:把 module-info.java 放进某个子包里(比如 src/main/java/com/example/module-info.java),结果 javac 完全无视它,还提示找不到模块描述。

  • 模块声明文件不是普通 Java 类,不参与包结构,JVM 和编译器只认根目录下的那个
  • IDE(如 IntelliJ)有时会自动创建在错误位置,需手动剪切到正确路径
  • Maven 构建时,如果用了 maven-compiler-plugin 但未显式启用模块支持(<release>9</release><source>9</source>),即使文件位置对,也会静默跳过模块解析

requiresrequires static 的区别直接影响运行时行为

requires java.sql; 表示该模块**必须**在编译和运行时都可用;而 requires static java.xml.bind; 表示只在编译期需要,运行时缺失不会导致 NoClassDefFoundError——但前提是代码中没在运行时主动反射加载或条件调用相关类。

典型踩坑场景:升级到 JDK 11 后移除了 java.xml.bind,如果你用的是 requires static,且没通过 Class.forName("javax.xml.bind.JAXBContext") 这类方式触发加载,应用能正常启动;但如果写了 requires java.xml.bind;,哪怕一行代码都没用到 JAXB,JVM 启动就会失败,报错:Module java.xml.bind not found

立即学习Java免费学习笔记(深入)”;

NexChatGPT
NexChatGPT

火爆全网的IDEA插件,支持IDEA全家桶

下载
  • requires static 不传递依赖,下游模块无法访问被 static 依赖的类型
  • 反射调用(如 Class.forName)、ServiceLoader 查找、或 instanceof 检查某类时,仍可能触发类加载,此时 static 也救不了你
  • JDK 9+ 中很多旧 API(如 javax.annotation)已转为可选模块,必须用 requires static + 显式添加第三方 jar(如 javax.annotation-api)才能安全使用

模块路径(--module-path)和类路径(-cp)不能混用

一旦用了 --module-path,JVM 就进入“模块模式”,此时 -cp 会被完全忽略(除非加 --class-path 并配合 --add-modules 等补救参数)。最直接的表现是:明明 jar 在 classpath 里,却报 ClassNotFoundException

常见错误操作:Maven 打包后执行 java -cp target/app.jar -m com.example.app/com.example.Main,结果失败——因为 -m 要求主模块必须在模块路径上,而 -cp 加载的 jar 默认视为“未命名模块”(unnamed module),无法被 -m 识别。

  • 正确做法是:java --module-path target/app.jar -m com.example.app/com.example.Main
  • 如果依赖了传统 jar(如 guava.jar),它们也得放进 --module-path,并确保你的模块声明里写了 requires guava;(前提是该 jar 已加了 Automatic-Module-Name MANIFEST 条目)
  • 没有模块声明的 jar 会变成 unnamed module,只能被其他 unnamed module 访问,不能被具名模块 requires

JDK 9+ 的默认模块图让 rt.jar 彻底消失

以前靠 -Xbootclasspath 黑科技替换核心类库的方式,在模块化之后彻底失效。因为 java.base 等平台模块由 JVM 内置加载,不再对应磁盘上的 rt.jarclasses.jsa 文件。试图用 --patch-module java.base=... 强行注入,只在开发调试阶段勉强可行,生产环境极易因签名、封装或启动顺序问题崩溃。

真实影响:所有依赖修改 StringArrayListClassLoader 内部行为的工具(如某些字节码增强 agent、老版本 JMockit、或自定义启动类加载器),在 JDK 9+ 上要么抛 java.lang.SecurityException: Prohibited package name,要么在模块边界处静默失败。

  • --add-opens 可临时打开模块封装(如 --add-opens java.base/java.lang=ALL-UNNAMED),但这是权宜之计,不是长期方案
  • 模块系统默认禁止跨模块反射访问非 exported 包,连 setAccessible(true) 都会被拦截
  • 如果你的项目还在用 sun.misc.Unsafejdk.internal.*,现在就得正视替代方案——这些包从 JDK 9 起就不是稳定 API,模块化只是让问题暴露得更早、更硬
模块系统的复杂性不在语法,而在它把过去模糊的“类路径隐式依赖”变成了显式的、带封装边界的契约。很多人卡住,不是因为写不出 module-info.java,而是没意识到:一旦启用模块,连 System.out.println 背后都牵扯到 java.base 的 exports、java.logging 的 optional usage、以及启动时模块解析器对 provides/uses 的校验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

986

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

377

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1760

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

375

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1312

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.8万人学习

Java 教程
Java 教程

共578课时 | 68.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号