使用JEP-458时,编译与运行命令为何不能用相同类路径?
JEP 458单文件运行的类路径问题
环境与场景
- JDK版本:OpenJDK 24-ea
- 使用特性:JEP 458(Java单文件源程序直接运行)
- 目录结构:
. ├───aa │ └───a │ abc.java │ └───b xyz.java
- 代码说明:
aa/a/abc.java:包声明为package a;,导入b.xyzb/xyz.java:包声明为package b;
操作与现象
- 当前处于
aa目录,执行单文件运行命令:
java --class-path "./../" a/abc.java
提示包b不存在,运行失败。
2. 执行相同类路径的编译命令却成功:
javac --class-path "./../" a/abc.java
- 移除
aa目录,让a和b目录同级后,java命令可正常运行。
原因与解决方案
这不是操作错误,而是javac和java单文件运行模式对路径的处理逻辑差异导致的:
javac的--class-path选项会同时用于查找依赖的类文件和源文件,指定./../后,编译器能找到上级目录下的b包源文件,因此编译通过。- 而
java运行单文件时,--class-path仅用于查找已编译的类文件;如果需要自动编译并查找依赖的源文件,得用--source-path选项指定源文件的根路径。
正确的运行命令应该是:
java --source-path "./../" a/abc.java
如果需要同时加载已编译的类,可同时指定类路径和源路径:
java --class-path "./../" --source-path "./../" a/abc.java
另外,移除aa目录后,a和b同级,当前目录就是源文件的根路径,java默认会在当前目录查找依赖源文件,所以无需额外参数就能正常运行。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

