requires 是 Java 模块系统(JPMS)中声明编译期和运行期模块依赖的关键字,必须在 module-info.java 中使用;requires transitive 将依赖传递给所有使用者,而 requires static 仅用于编译期可选依赖。`requires` 指令本身**不是独立指令**,它不直接“强制要求变量处理模块存在”——这个说法混淆了不同语言、不同上下文中的 `requires` 含义。你需要先明确:你是在写 **Java 模块系统(JPMS)的 module-info.java**?还是在写 **C++20 Concepts 中的 requires 表达式**?抑或是 **构建工具(如 Gradle/Maven)中的依赖声明**? 下面分三种常见场景说明如何“强制要求某模块/类型/能力存在”,并给出对应、准确、可操作的方式:
Java 模块系统:用 `requires` 声明编译期模块依赖
在 module-info.java 中,requires 用于声明本模块**必须可访问**另一个命名模块(如 java.base 或第三方模块),否则编译失败。
- 基础写法:
requires java.sql;→ 表示本模块依赖 JDK 的 SQL 模块 - 强制传递性(让下游模块也能用):
requires transitive javafx.controls; - 可选依赖(不强制):
requires static org.junit.jupiter.api;(仅编译测试时需要) - ⚠️ 注意:
requires管的是**已命名的 Java 模块**,不是任意“变量处理模块”。所谓“变量处理模块”需先被打包为合规模块(含module-info.class)才能被requires引用
C++20 Concepts:用 requires 表达式约束模板参数具备特定成员
如果你希望模板函数只接受“含有 value 成员变量”的类型,就用 requires 配合点号访问检查:
- 定义 concept:
template<typename T><br>concept HasValueMember = requires(T t) { t.value; }; - 使用该 concept:
template<HasValueMember T><br>auto get_value(T obj) { return obj.value; } - 调用
get_value(some_struct)时,若some_struct没有公有可访问的value成员,编译器立刻报错,提示“constraints not satisfied” - ✅ 这才是真正“强制要求某成员变量存在”的编译期机制
构建工具(Gradle/Maven):用 requires 不适用,应改用依赖声明
Gradle 或 Maven 中没有 requires 指令。你要“强制引入某个处理变量逻辑的库”,应写标准依赖:
- Gradle(Kotlin DSL):
implementation("com.example:var-processor:1.2.0") - Maven:
<dependency><groupid>com.example</groupid><artifactid>var-processor</artifactid><version>1.2.0</version></dependency> - 若该库提供 Java 模块,且你项目也启用 JPMS,则还需在
module-info.java中requires com.example.varprocessor;

















