Maven多模块项目中JavaCompiler API找不到模块化依赖类问题求助
解决方案
1. 补充动态编译的模块/类路径参数
Java 9+模块化后JavaCompiler默认不会读取运行时的模块路径、类路径配置,需要你在触发编译时手动传入对应参数:
List<String> compileOptions = new ArrayList<>(); // 配置模块路径,用于读取已模块化的B、C模块类 compileOptions.addAll(List.of("--module-path", System.getProperty("jdk.module.path"))); // 配置类路径,用于读取未模块化的A模块类 compileOptions.addAll(List.of("-cp", System.getProperty("java.class.path"))); // 明确指定需要引入的模块,替换为你C模块的实际模块名 compileOptions.addAll(List.of("--add-modules", "你的C模块名称")); // 按需配置:如果C模块的包没有公开导出给未命名模块,加以下参数放开权限 // compileOptions.addAll(List.of("--add-exports", "你的C模块名/包路径=ALL-UNNAMED")); // 把参数传入编译任务 JavaCompiler.CompilationTask task = compiler.getTask( null, 你的自定义JavaFileManager实例, 你的诊断监听器, compileOptions, null, 待编译的JavaFileObject列表 );
2. 自定义JavaFileManager适配模块系统
你继承的ForwardingJavaFileManager需要保留标准文件管理器的模块处理能力,不要全量重写核心查找方法:
public class CustomJavaFileManager extends ForwardingJavaFileManager<StandardJavaFileManager> { // 你的自定义内存类缓存 private final Map<String, JavaFileObject> customFileCache; public CustomJavaFileManager(StandardJavaFileManager standardManager, Map<String, JavaFileObject> cache) { super(standardManager); this.customFileCache = cache; } // 优先查自定义内存缓存,查不到再委托给标准实现找模块路径、类路径下的类 @Override public Iterable<JavaFileObject> list(Location location, String packageName, Set<JavaFileObject.Kind> kinds, boolean recurse) throws IOException { List<JavaFileObject> result = new ArrayList<>(); // 先加载自定义内存里的类 customFileCache.values().stream() .filter(file -> file.getKind() == kinds.iterator().next() && file.getName().replace("/", ".").startsWith(packageName)) .forEach(result::add); // 再加载系统路径下的类(包含C模块的类、A模块的类) super.list(location, packageName, kinds, recurse).forEach(result::add); return result; } // 保留标准实现的模块位置查找逻辑,不要重写覆盖 @Override public Location getLocationForModule(Location location, String moduleName) throws IOException { return super.getLocationForModule(location, moduleName); } }
3. 异常排查提示
- 先打印
jdk.module.path和java.class.path两个系统变量,确认路径里包含A、C模块的jar包或者编译后的类目录 - 给编译任务添加
DiagnosticListener输出完整报错信息,确认是路径找不到还是模块导出权限问题 - 如果是Maven运行时路径缺失,可在exec插件配置里补充
addExports/addModules参数,确保运行时模块路径完整
内容的提问来源于stack exchange,提问作者gym
相关产品推荐
相关产品推荐

