Java在交互式Shell可运行但Shell脚本中无法执行问题排查
这个问题我之前也碰到过!核心原因大概率是脚本执行时的工作目录和你交互式Shell的工作目录不一致,导致Java的类路径找不到正确的文件。
为什么交互式Shell能跑,脚本不行?
当你在交互式Shell里敲命令时,肯定是在项目根目录下(也就是包含lib、bin这些文件夹的目录),所以lib/java-json.jar和bin这些相对路径能被正确解析。但当你运行脚本时,如果是从其他目录启动(比如./scripts/run.sh),脚本的工作目录会是你当前所在的目录,而不是脚本本身的目录,这时候相对路径就指向错误的位置,自然找不到主类了。
解决方案:让脚本先切换到正确的目录
在脚本开头加上一行,强制切换到脚本所在的目录,这样不管你从哪里运行脚本,相对路径都能正确指向项目文件:
cd "$(dirname "$0")" || exit 1
$0代表脚本本身的路径,dirname "$0"会提取脚本所在的目录|| exit 1是为了如果切换目录失败(比如脚本路径不对),直接退出脚本,避免后续错误执行
可选:添加调试信息排查问题
如果还是有问题,可以在脚本里加几行调试代码,确认工作目录和文件是否存在:
echo "Current working directory: $(pwd)" ls lib/java-json.jar bin/com/theaigames/game/warlight2/Warlight2.class 2>/dev/null || echo "ERROR: Missing required files in lib or bin!"
这样运行脚本后,你能清楚看到是不是目录不对,或者文件缺失。
修改后的完整脚本
#!/bin/sh # 切换到脚本所在的目录 cd "$(dirname "$0")" || exit 1 echo "--- Running game ---" # 调试用(可选,确认路径正确后可移除) echo "Working directory: $(pwd)" ls lib/java-json.jar bin/com/theaigames/game/warlight2/Warlight2.class 2>/dev/null || echo "WARNING: Some required files might be missing!" # 执行核心命令 java -cp lib/java-json.jar:bin:. com.theaigames.game.warlight2.Warlight2 "../example-map.txt" "java -cp . bot.BotStarter" "java -cp . bot.BotStarter" 2>err.txt 1>out.txt
另外提个小细节:你给Bot的命令java -cp bot.BotStarter看起来有点问题,正确的格式应该是java -cp . bot.BotStarter(指定类路径为当前目录,再指定主类),如果交互式Shell能跑可能是你的环境默认类路径包含了当前目录,但脚本里最好明确写出来避免踩坑。
内容的提问来源于stack exchange,提问作者Florian Pellegrin




