Java 9中用requires static声明编译期依赖,运行时可不存在;需配合static final boolean DEBUG = false和if (DEBUG) {}实现逻辑剔除,并通过构建配置隔离模块。

Java 9 模块系统中,编译期可选、运行时无需存在的依赖,用 requires static 配置即可实现。它不是“可选加载”,而是明确告诉编译器:“我需要你认识这个模块里的类型(用于类型检查、注解处理、条件编译),但运行时哪怕它根本不存在,也不许报错”。
核心写法:在 module-info.java 中声明
假设你有一个调试辅助模块 com.example.debug,主业务模块想在开发阶段使用它的 @DebugOnly 注解和 DevModeUtils 类,但生产环境绝对不打包、不加载它:
- 在主模块的
module-info.java中写:requires static com.example.debug; - 注意:不需要
exports或opens它,也不需在运行时提供该模块 JAR - 编译时,javac 会检查
com.example.debug是否可用(确保注解/工具类存在);运行时 JVM 完全忽略这一行
配套关键实践:让调试代码真正“消失”
光有 requires static 不够——你还得防止调试逻辑残留在字节码里。推荐组合使用编译期常量:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义一个
static final boolean DEBUG = false;(由构建工具注入,如 Maven 的compilerArgs) - 所有调试逻辑包在
if (DEBUG) { ... }块内 - JDK 编译器(javac)会彻底优化掉
if (false)分支,连字节码都不生成(JLS §14.21) - 调试模块内可提供
DebugSupport.isAvailable()方法,返回true仅当模块已加载——主模块调用前已被requires static约束了编译可行性
构建阶段物理隔离:Maven 示例
靠代码逻辑不够可靠,必须在构建环节切断物理联系:
立即学习“Java免费学习笔记(深入)”;
-
开发 profile(如
mvn compile -Pdev):
– 把com.example.debug加为<scope>compile</scope>依赖
– 配置maven-compiler-plugin添加--add-modules com.example.debug -
生产 profile(如
mvn package -Pprod):
– 排除com.example.debug依赖
– 不传--add-modules,且设DEBUG = false
– 用jlink打包时,不 include 该模块,最终镜像里完全找不到它
IDE 支持与验证
主流 IDE(如 IntelliJ IDEA)能识别 requires static:
- 启用 “Use --add-modules” 设置后,开发模式下自动补全调试工具类,支持跳转和类型检查
- 切换到生产构建配置时,相关类名会灰显或提示 “cannot resolve symbol”,提前暴露误用风险
- 运行时若未加模块,
Class.forName("com.example.debug.DevModeUtils")会抛ClassNotFoundException,但只要不执行到那行代码(靠if (DEBUG)屏蔽),就完全安全

















