2013-02-28 44 views
2

我正在努力爲我們的一個Java應用程序創建測試用例。 在我的代碼中,我的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。

+4

爲什麼要通過批處理文件執行此操作,而不是直接通過Runtime.exe或ProcessBuilder直接運行目標'java'命令,是否有特殊原因? – 2013-02-28 13:27:28

+2

主要是因爲我的這個.bat文件正在複製一個在Linux上運行的類似的shell腳本,而我現在不想改變它的設計。在生產中我們的應用程序運行在Linux機器上我們的開發環境是Windows。 – 2013-02-28 13:40:09

+0

嘗試用CALL替換START。 START正在創建一個不再連接或響應批處理文件的新外部進程。當然,CALL可能會出現同樣的「掛起」,但值得一試。也可以嘗試@CALL(注意符號)。 – Lizz 2013-03-01 07:19:46

回答

2

請勿在出口處使用/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,您需要使用上述正確的方法,這是我不確定的。

相關問題