You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK 9中javac混合使用--class-path与--module-path编译问题求助

我来帮你排查这个编译错误的问题,你遇到的package org.... does not exist通常和模块系统的导出规则、依赖路径配置有关,咱们一步步来解决:

1. 检查目标模块的导出声明

首先确认你的simpleModule模块是否正确对外暴露了那个报错的org....包。打开模块根目录下的module-info.java,看看有没有类似这样的声明:

module simpleModule {
    exports org.your.package.name; // 替换成你实际报错的org开头的包名
}

如果没有这条exports语句,模块内部的包是默认对外隐藏的,即使未命名模块的类引用了它,javac也会提示包不存在。

2. 确认依赖JAR的类型与路径配置

你提到包含该包的JAR放在lib目录,但要先区分这个JAR是模块化JAR(内部包含module-info.class)还是传统的非模块化JAR:

  • 如果是模块化JAR:不能放在-cp(类路径)里,得把lib目录加到--module-path参数中,修改后的命令大概是这样:
    javac --module-path modules;lib --add-modules simpleModule -d out @classes.txt
    
    毕竟模块化JAR必须放在模块路径下才能被Java模块系统正确识别,类路径里的模块化JAR会被当作普通JAR处理,很可能无法正确加载目标包。
  • 如果是传统非模块化JAR:那-cp lib\*的配置是没问题的,但你可以用jar tf lib/your-target-jar.jar命令查看JAR内部的内容,确认那个org....包确实存在于JAR里,避免放错了JAR文件。
3. 调整编译命令的逻辑(同时编译模块和未命名类)

你需要同时编译simpleModule和使用它的未命名模块类,这里要注意两种情况:

  • 如果modules目录里放的是模块的源文件(不是已编译的模块字节码):那应该用--module-source-path来指定模块源文件的根路径,而不是--module-path。比如假设模块源文件在modules/simpleModule下,未命名类的源文件在其他目录,命令可以改成:
    javac -cp lib\* --module-source-path modules -d out --module simpleModule @unnamed-classes.txt
    
  • 如果已经提前编译好了simpleModule:那--module-path应该指向已编译模块的输出目录(比如out/simpleModule),而不是源码目录,这样javac才能找到已编译好的模块类。
4. 验证类列表文件的内容

最后检查下@classes.txt里的内容,确保里面包含了所有需要编译的源文件路径——包括未命名模块的类,要是你打算同时编译模块的话,模块里的源文件路径也要列进去(或者直接用--module参数指定模块,让javac自动编译模块内的所有类)。

内容的提问来源于stack exchange,提问作者David stands with Ukraine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:36:40