You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JPMS模块时是否仍需配置Maven依赖?

JPMS与Maven结合的核心原理及你的困惑解答

先明确核心前提:JPMS和Maven的本质差异

  • Maven是构建依赖管理工具:负责项目构建流程、依赖Jar的下载、编译时类路径的组装,它的"依赖"是构建层面的资源获取逻辑。
  • JPMS是JVM层面的模块系统:负责运行时/编译时的类可见性控制、封装规则,它的"依赖"是模块间的逻辑依赖(requires语句),属于JVM的类加载机制范畴。
    两者之所以被称为"正交",就是因为它们完全在不同层面工作,互不绑定,但可以配合实现更严谨的依赖和封装。

困惑点1:遗留非JPMS代码使用带JPMS的库,能否获得封装优势?

不能。核心原因在于JVM的两种运行模式差异:

  1. 类路径模式(Classpath Mode):这是遗留代码默认的运行模式,所有Jar都被JVM视为无名模块(unnamed module)。在这种模式下,JPMS的exports/opens等封装规则完全不生效——无名模块中的所有类对其他类都是完全可见的,不管你的库有没有module-info.java。
  2. 你通过Maven添加依赖,本质是把库Jar放到了项目的类路径中,JVM会以类路径模式处理它,所以库中所有非对外类也能被消费端访问,JPMS的封装优势完全发挥不出来。

困惑点2:JPMS是否无需在Maven中声明依赖?

这是对JPMS和Maven职责的误解:

  1. JPMS本身确实不依赖Maven:JPMS是JVM的特性,它只关心模块路径(Modulepath)上有没有所需的模块Jar。但实际开发中,你不可能手动去下载、管理所有依赖Jar——这正是Maven的职责。
  2. 你提到"无需在pom中添加依赖就能引入模块",大概率是你手动把库Jar放到了模块路径中,但这不是常规开发流程。Maven的pom依赖声明是为了让构建工具自动下载、管理依赖Jar,并在编译/运行时将其放到正确的路径(类路径或模块路径)。
  3. 另外,你的主应用目前无法改为JPMS(即只能用类路径模式),即使你把库放到模块路径,也无法获得封装优势:因为类路径的无名模块可以访问模块路径上所有命名模块的所有包(JPMS的设计规则),只有当主应用也转为JPMS模块(使用模块路径),并在自身module-info.java中通过requires声明依赖该库模块时,JPMS的exports封装规则才会生效,仅开放指定包。

内容的提问来源于stack exchange,提问作者bmurauer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:21