Java 9 Jigsaw:如何一次性修补不同模块中的类
处理JPMS多模块文件的便捷方案
当然有便捷方法啦!在Java平台模块系统(JPMS)环境下,一次性处理分属不同模块的多个文件,你可以试试下面这几个实用方案:
1. 用模块路径通配符直接批量操作(JDK 9+支持)
如果你的代码已经按照标准JPMS结构组织——每个模块对应一个独立目录,且目录下包含module-info.java——那可以直接用通配符来批量指定模块路径,再配合文件查找命令一次性处理所有源文件。
比如编译命令可以这么写:
javac --module-path mods/* -d out $(find src -name "*.java")
这里mods/*会自动匹配所有模块目录,find src -name "*.java"会递归找出所有Java源文件,一次性完成跨模块的编译操作。
2. 借助构建工具(Maven/Gradle)——生产环境首选
这是工业界最常用的方案,构建工具天生就支持多模块项目的批量管理:
- Maven:创建一个父POM文件,在其中用
<modules>节点声明所有子模块,执行mvn compile就能一键编译所有模块的代码,它会自动处理模块间的依赖关系、路径配置等问题。 - Gradle:在
settings.gradle文件中用include语句指定所有子模块,运行gradle build就能批量完成构建,Gradle还支持更灵活的模块依赖定制。
3. 自定义脚本批量处理
如果你不想用构建工具,也可以自己写个简单的脚本(Shell或Windows批处理)来遍历模块目录,逐个处理:
比如一个Shell脚本示例:
#!/bin/bash # 遍历所有模块目录 for module_dir in ./modules/*; do # 检查当前目录是否是JPMS模块(存在module-info.java) if [ -f "$module_dir/module-info.java" ]; then # 编译当前模块的所有Java文件,输出到对应模块的输出目录 mkdir -p ./output/$(basename $module_dir) javac -d ./output/$(basename $module_dir) $(find $module_dir -name "*.java") fi done
这个脚本会自动识别包含module-info.java的目录作为JPMS模块,然后分别编译每个模块的文件,最后把编译结果输出到对应模块的专属目录里。
小提醒
- 要确保每个模块的
module-info.java正确声明了依赖,比如如果用到java.util.logging,就需要在模块声明里加上requires java.logging;,否则编译会出现依赖缺失的错误。 - 如果是运行阶段,同样可以用
--module-path通配符配合--module指定主模块来批量运行,或者直接用构建工具的运行命令更省心。
内容的提问来源于stack exchange,提问作者Gayan Weerakutti
相关产品推荐
相关产品推荐

