Ubuntu系统中如何在.sh脚本中正确定位并执行Java类?
问题根因
该冲突的核心原因是两种执行方式的工作目录不匹配,以及部分场景下shell通配符展开规则差异:
- 你直接在终端执行命令时,
./指向的是当前终端所处的工作目录,该目录下刚好包含com.ubiq.update.MainEntry对应的类文件或jar包,类路径加载正常。 - 执行
ubiqstart.sh脚本时,脚本默认的工作目录是你执行脚本命令时所在的终端目录,而非脚本自身的存放目录,一旦你不是在目标类所在的目录下执行脚本,-cp "./*"匹配到的路径就会出错,找不到对应的类。 - 额外场景:脚本中
-cp "./*"被双引号包裹时,部分shell环境不会自动展开通配符*,会把./*当成单个字面量文件名,也会导致类路径加载失败。
修复方案
方案1:脚本开头锁定工作目录(最推荐)
在ubiqstart.sh最开头添加目录切换逻辑,强制脚本的工作目录和你直接执行命令时的工作目录保持一致,如果目标工作目录就是脚本自身的存放目录,可直接用以下代码:
#!/bin/bash # 切换到脚本所在的目录,切换失败直接退出避免后续错误 cd "$(dirname "$0")" || exit 1
之后保留你原有的Java执行命令即可,此时脚本内的./和你直接在终端执行命令时的指向完全一致。
方案2:移除类路径的引号(适配通配符展开)
如果是引号导致通配符未正常展开,直接去掉-cp参数的双引号即可:"../java/bin/java" -cp ./* com.ubiq.update.MainEntry
方案3:使用绝对路径写死类路径(适合部署路径固定的场景)
直接把类路径替换为依赖包所在目录的绝对路径,规避工作目录差异的影响,示例:"../java/bin/java" -cp "/你存放依赖的绝对路径/*" com.ubiq.update.MainEntry
内容的提问来源于stack exchange,提问作者Fangyi Li
相关产品推荐
相关产品推荐

