requires transitive用于Java 9模块系统中显式声明可传递的依赖,使下游模块能直接使用上游模块所依赖的第三方模块中的导出类型,避免编译错误;仅当库模块的公共API暴露了该依赖的类型(如参数、返回值含Logger或ObjectMapper)时才应使用,不可滥用或与构建工具依赖机制混淆。

传递依赖(requires transitive)是 Java 9 引入的模块系统(JPMS)中用于显式声明“可传递导出”的关键机制,它解决的不是 Maven 或 Gradle 中的依赖版本继承问题,而是 Java 运行时模块间类可见性与访问权限的传递控制。它不简化变量引用链本身,而是让下游模块能 直接使用上游模块所依赖的第三方模块中的公开类型,从而避免手动重复声明依赖。
什么时候需要 requires transitive?
当你设计一个被其他模块使用的库模块(比如工具包、客户端 SDK),且该模块内部使用了某个第三方模块(如 org.slf4j 或 com.fasterxml.jackson.core),并希望调用方模块能直接使用这些第三方类型的 API(例如传入 Logger 实例或 ObjectMapper)时,就必须用 requires transitive 声明——否则调用方会编译失败(“package not visible”)。
- ❌ 普通
requires slf4j.api;:只允许本模块内使用org.slf4j的类型,调用方无法访问 - ✅
requires transitive slf4j.api;:调用方模块在requires你这个模块后,也能直接使用org.slf4j.Logger
如何正确配置 requires transitive?
在模块声明文件 module-info.java 中,仅对真正需要“向上传递访问权”的依赖使用 transitive:
一款AI工具,主要用于面向CTF的ZIP破解与恢复,使用捆绑的ZipCracker引擎。当Codex或OpenClaw需要在授权情况下分析或恢复受加密ZIP时使用,适合需要提升相关任务效率的用户。
module com.example.httpclient {
requires java.net.http;
requires transitive slf4j.api; // ✅ 允许使用者直接 new Logger()
requires transitive com.fasterxml.jackson.databind; // ✅ 允许使用者直接用 ObjectMapper
requires java.logging; // ❌ 不加 transitive:仅本模块内部使用
}
注意:transitive 不影响变量或函数的“引用链”,它只控制 包级类型是否对下游模块开放。变量仍需按常规方式导入和调用,不存在“自动注入”或“隐式赋值”。
常见误用与避坑点
- 不要为所有
requires加transitive:过度使用会污染下游模块的命名空间,引发意外的类冲突或不必要的依赖暴露 - 不能用于
opens或exports子句:只有requires支持transitive修饰 - 与 Maven 的
或 Gradle 的compile api配置 概念相似但层级不同:前者作用于 JVM 运行时模块层,后者作用于构建时依赖传递层,二者需协同但不可替代 - 若下游模块仍报 “package is not visible”,请检查:是否已
requires你的模块;是否该第三方模块自身也声明了exports对应包;是否模块路径(--module-path)完整无遗漏
与构建工具依赖传递的区别
Maven 的 或 Gradle 的 api 解决的是“子模块要不要自动获得父模块/被依赖模块的依赖版本”,属于 构建期依赖解析;而 requires transitive 解决的是“运行时模块能否看到并使用另一个模块所依赖的包”,属于 JVM 模块系统的访问控制。两者目标不同,常需配合使用:
- Maven 中用
(默认)确保依赖参与编译 → 对应 JPMS 中可能需要compile requires transitive - 若 Maven 中用了
,则通常 不应 在runtime module-info.java中声明requires transitive,因为该依赖本就不该出现在编译期 API 中










