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
相关产品推荐
相关产品推荐

