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

使用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.xyz
    • b/xyz.java:包声明为package b;

操作与现象

  1. 当前处于aa目录,执行单文件运行命令:
java --class-path "./../" a/abc.java

提示包b不存在,运行失败。
2. 执行相同类路径的编译命令却成功:

javac --class-path "./../" a/abc.java
  1. 移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:16