【问题标题】:Get exit code from a java application in batch file从批处理文件中的 java 应用程序获取退出代码
【发布时间】:2013-02-28 13:24:17
【问题描述】:

我目前正在努力为我们的一个 java 应用程序创建测试用例。 在我的代码中,我的 java 应用程序调用一个批处理文件,该文件又启动一个单独的 java 进程,该进程返回一个错误代码,我需要从调用 java 应用程序中使用该代码。 我正在执行以下操作来调用我的批处理文件:

Process process = runTime.exec(new String[]{"cmd.exe","/c",scriptPath});
exitValue = process.waitFor();

批处理文件如下:

@echo off
cd %~dp0
java -cp  frames.FrameDriver
SET exitcode=%errorlevel%
exit /B %exitcode%

现在有了上面的代码和批处理文件,我的 JUnit 框架就挂在这个特定的测试用例上,就好像它在等待它结束一样。现在,当 JUnit 挂在测试用例上时,转到任务管理器并结束 java.exe 进程将允许 JUnit 框架继续处理其他用例。

双击运行 .bat 文件可以正常运行 Java 应用程序。

在我的批处理文件中的java 命令之前添加START 批处理命令似乎可以解决挂起问题,但我似乎无法从我的Java 应用程序中获得正确的退出代码,因为它始终为0。( Java 应用程序使用 System.exit(INTEGER_VALUE)) 以错误代码退出。我假设 %errorlevel% 值被“start”命令自己的退出值覆盖。

谁能告诉我如何解决这个问题?

谢谢。

P.S:如果有什么不同,我使用的是 JDK 5 和 Netbeans 5.5.1。

【问题讨论】:

  • 您通过批处理文件而不是直接通过Runtime.execProcessBuilder 直接运行目标java 命令是否有特殊原因?
  • 主要是因为我的这个.bat文件正在复制一个类似的运行在Linux上的shell脚本,我现在不想改变它的设计。在生产中,我们的应用程序在 Linux 机器上运行。然而,我们的开发环境是 Windows。
  • 尝试用 CALL 代替 START。 START 正在创建一个新的外部进程,该进程不再连接或响应您的批处理文件。当然,CALL 也可能会出现同样的“挂起”,但值得一试。也可以试试@CALL(注意 at 符号)。
  • 当我使用“START”时,挂起问题不再存在。使用“START”时,我猜我的 java 应用程序的退出代码错误。
  • @MouhammedSoueidane 你怎么知道你的frames.FrameDriver 什么时候退出?

标签: java batch-file exit


【解决方案1】:

请勿在出口处使用 /B。以下是我将如何编写脚本:

@ECHO off
ECHO Running %~nx0 in %~dp0
CALL :myfunction World
java.exe -cp  frames.FrameDriver
IF NOT ERRORLEVEL 0 (
  SET exitcode=1
) ELSE (
  SET exitcode=0
)
GOTO :END
:myfunction
ECHO Hello %~1
EXIT /B 0
:END
EXIT %exitcode%

注意:此外,您可以通过 3 种不同的方式执行 java 程序:

  java.exe -cp  frames.FrameDriver
  CALL java.exe -cp  frames.FrameDriver
  cmd.exe /c java.exe -cp  frames.FrameDriver

这非常关键,因为您的 Java 命令可能会以退出代码退出,并且为了将退出代码正确传递给 ERRORLEVEL var,您需要使用上述正确的方法,我不确定。

【讨论】:

    猜你喜欢
    • 2017-04-23
    • 2016-04-29
    • 1970-01-01
    • 2012-12-25
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多