Java 怎么在非模块化项目中引入命名模块

千辰同学_4764

千辰同学_4764

2026-09-03

619人浏览

原创

非模块化项目可使用命名模块,但须将依赖jar放模块路径并用--module-path启动;jvm自动使其被未命名模块可读,但不可访问未导出包,且requires static/transitive无效。

java 怎么在非模块化项目中引入命名模块

非模块化项目(即没有 module-info.java 的传统 classpath 项目)可以使用命名模块(named module),但需满足两个前提:JVM 启动时必须用 --module-path 而非 -cp,且所有依赖的命名模块必须放在模块路径上——否则它们会被降级为自动模块或根本不可见。

确保模块路径正确设置

即使主项目是非模块化的,只要它依赖某个已模块化的 JAR(如 slf4j-api-2.0.13.jar 或 gson-2.10.1.jar),就必须把该 JAR 放进模块路径,而不是类路径。否则 JVM 无法识别其 module-info.class,也无法执行模块解析。

  • 命令行运行时,用 java --module-path lib/ --class-path . MyApp,其中 lib/ 下放的是命名模块 JAR
  • IDEA 中需手动修改 Run Configuration:在 VM options 里加 --module-path lib/,并**清空 Classpath 设置**(或设为“Use classpath of module”并选空模块)
  • Maven 用户推荐用 exec:java 插件,它默认将 compile 输出和 dependency:copy-dependencies 结果统一纳入模块路径

命名模块会自动变成“可读模块”

在非模块化项目中,JVM 会把所有位于模块路径上的命名模块自动加入“未命名模块”的可读集合(readability graph)。这意味着你可以直接 new 它们的公开类、调用其 public 方法,无需 requires 声明——这是 JPMS 对兼容性的关键设计。

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载
  • 例如:gson-2.10.1.jar 含 module-info.class 声明 module com.google.gson,你在普通 Main 类里写 new Gson() 完全合法
  • 但注意:你不能访问它未导出(exports)的包,比如 com.google.gson.internal 依然受封装限制
  • 若某命名模块声明了 requires static 或 requires transitive,这些依赖对非模块化项目无效,只影响其他命名模块

避免常见陷阱

混合使用模块路径与类路径极易引发冲突。尤其当同一个库既出现在 --module-path 又出现在 -cp 时,JVM 会报错或静默忽略其中一个。

  • 不要把命名模块 JAR 同时放进 --module-path 和 -cp;非模块化项目应只用前者承载模块化依赖
  • 第三方库若未模块化(无 module-info.class),它会成为自动模块——名称由 JAR 文件名推断(如 commons-lang3-3.12.0.jar → 自动模块名 org.apache.commons.lang3),此时仍可 requires org.apache.commons.lang3,但仅限于其他命名模块中;非模块化项目中它只是普通 classpath 行为,不受模块规则约束
  • 检查模块是否真被加载:运行时加 --show-module-resolution 参数,观察输出中是否有 find module com.google.gson 这类日志

何时需要转为真正模块化项目

如果你发现以下情况,说明非模块化方式已到边界,建议补上 module-info.java:

  • 要控制反射访问(如 Spring、Hibernate 需打开 opens 包)
  • 需精确传递依赖(requires transitive)给下游使用者
  • 想利用 jlink 构建最小化运行镜像
  • 遇到 IllegalAccessError 且确认是因未导出内部包导致

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10117

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7262

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6372

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2669

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19991

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习