【问题标题】:java console output not printing in shell script [duplicate]java控制台输出未在shell脚本中打印[重复]
【发布时间】:2021-11-20 11:55:07
【问题描述】:

我正在编写一个 shell 脚本,我将在其中调用一个 jar 文件。

当我执行 shell 脚本时,我从调用 java 中得到一个返回码 1。控制台输出 jar 文件也不会在终端中打印

javaArgs="-jar $baseRoot/lib/preprocess.jar"
javaCmd="java $javaArgs \"$filePath1\" \"$filePath2\"";
echo $javaCmd
$javaCmd
recode=$?
echo $recode

输出

Exec From Shell Script

当我直接在终端中运行 jar 文件时,我得到了预期的输出,也没有收到警告。

java -jar /shelldir/lib/preprocess.jar "/shelldir/data/file1.txt" "/shelldir/data/file1.xml"

从shell脚本运行时如何获取jar文件的控制台输出?

附加信息:我正在从 putty bash 终端执行 shell 脚本。 编辑:我在 jar 中使用 log4j 并使用 maven-shade-plugin 和 maven-jar-plugin 来构建我的 jar 以指定类路径。下面pom中提到的conf文件夹有log4j.properties文件

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.file.PreProcessor</mainClass>
                                </transformer>
                            </transformers>
                            <minimizeJar>false</minimizeJar>
                            <outputFile>lib/preprocess.jar</outputFile>
                            <!-- <outputDirectory>target\maven-shade</outputDirectory> -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Command: mvn jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Class-Path>../conf/</Class-Path>
                        </manifestEntries>
                        <manifest>
                            <addDefaultEntries>true</addDefaultEntries>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                    <!-- <outputDirectory>lib</outputDirectory> -->
                </configuration>
            </plugin>

log4j.properties

#define the console appender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender

# now define the layout for the appender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-4r [%t] %-5p %c{1} %x - %m%n

log4j.appender.traceLog=org.apache.log4j.RollingFileAppender
log4j.appender.traceLog.MaxFileSize=30MB
log4j.appender.traceLog.MaxBackupIndex=20
log4j.appender.traceLog.layout = org.apache.log4j.PatternLayout
log4j.appender.traceLog.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-4r [%t] %-5p %c{1} %x - %m%n

log4j.appender.infoLog=org.apache.log4j.RollingFileAppender
log4j.appender.infoLog.MaxFileSize=30MB
log4j.appender.infoLog.MaxBackupIndex=20
log4j.appender.infoLog.Threshold=INFO
log4j.appender.infoLog.layout = org.apache.log4j.PatternLayout
log4j.appender.infoLog.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-4r [%t] %-5p %c{1} %x - %m%n

# now map our console appender as a root logger, means all log messages will go to this appender
log4j.rootLogger = TRACE, infoLog,traceLog

【问题讨论】:

  • 阅读 tee 命令。
  • 你能提供你的shell脚本输入吗?由于脚本看起来正确,因此尚不清楚出了什么问题。第二个字符串中唯一的 - 分号是不需要的,但它不是错误,只是没用。
  • @Saboteur 添加了更多信息
  • 从参数中删除双引号可以使代码正常工作。但是,如果任何论点中有空格怎么办。因为我的参数是文件路径。我会在这里尝试并更新
  • 当我的 args 包含空格时它不起作用 Invalid Arguments. Please verify the input arguments 并且返回码是 1

标签: java linux bash shell


【解决方案1】:

你可以试试这个:

javaArgs="-jar $baseRoot/lib/preprocess.jar"
javaCmd="java $javaArgs \"$filePath1\" \"$filePath2\"";
echo $javaCmd
echo $($javaCmd)
recode=$?
echo $recode

【讨论】:

  • 我尝试了上面的代码,我得到$recode为0但jar没有成功(和以前一样)。
猜你喜欢
  • 2020-12-22
  • 2020-03-21
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多