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

shell脚本调用jar无控制台输出且返回码1如何解决

问题根因说明

1. Shell命令拼接存在引号解析错误

你将带转义双引号的整条命令存入字符串变量后再执行,Bash不会把转义符识别为参数边界的标记,反而会把双引号作为参数内容的一部分传递给Java进程,导致传入的文件路径格式错误,程序找不到目标文件所以返回码为1。

2. Log4j未配置控制台输出

你当前的log4j.properties中虽然定义了consoleAppender,但log4j.rootLogger的配置项里仅添加了文件输出器infoLog、traceLog,没有引入控制台输出器,所以日志默认只会写入文件,不会打印到终端。

3. 工作目录不匹配导致Log4j配置加载失败

你在POM中配置的Jar包Class-Path为相对路径../conf/,如果Shell脚本执行时的工作目录和你手动执行命令时的目录不一致,Java进程就无法找到log4j.properties配置文件,Log4j初始化异常也会导致日志输出不符合预期。

解决方案

1. 修正Shell脚本的命令执行写法

不要将整条命令存入字符串变量执行,直接执行命令或用数组存储参数避免引号解析问题:

# 写法1:直接执行
java -jar "$baseRoot/lib/preprocess.jar" "$filePath1" "$filePath2"
recode=$?
echo $recode

# 写法2:需拆分参数时用数组存储
javaArgs=(-jar "$baseRoot/lib/preprocess.jar" "$filePath1" "$filePath2")
java "${javaArgs[@]}"
recode=$?
echo $recode

2. 修改Log4j配置开启控制台输出

修改log4j.properties中的rootLogger配置,添加控制台输出器:

# 原配置:log4j.rootLogger = TRACE, infoLog,traceLog
# 替换为以下配置
log4j.rootLogger = TRACE, infoLog,traceLog,consoleAppender

3. 固定配置文件加载路径

要么在脚本中先切换到对应工作目录保证相对路径生效,要么直接通过JVM参数指定Log4j配置的绝对路径,避免依赖工作目录:

# 方案1:先切换到jar包所在目录再执行
cd "$baseRoot/lib" || exit 1
java -jar preprocess.jar "$filePath1" "$filePath2"

# 方案2:直接指定log4j配置文件绝对路径
java -Dlog4j.configuration=file:"$baseRoot/conf/log4j.properties" -jar "$baseRoot/lib/preprocess.jar" "$filePath1" "$filePath2"

内容的提问来源于stack exchange,提问作者AsharafAero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:36:05