You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java在交互式Shell可运行但Shell脚本中无法执行问题排查

这个问题我之前也碰到过!核心原因大概率是脚本执行时的工作目录和你交互式Shell的工作目录不一致,导致Java的类路径找不到正确的文件。

为什么交互式Shell能跑,脚本不行?

当你在交互式Shell里敲命令时,肯定是在项目根目录下(也就是包含libbin这些文件夹的目录),所以lib/java-json.jarbin这些相对路径能被正确解析。但当你运行脚本时,如果是从其他目录启动(比如./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

火山引擎 最新活动