2011-04-07 88 views
1

奇怪的行爲我有一些Java代碼在Windows機器上執行某個命令。但是,這種行爲很奇怪,因爲同一個命令在一臺機器上運行,但在另外三臺機器上運行失敗。據我所知,四臺機器都是相同的。Runtime.getRuntime()。exec()

該命令是這樣的:

cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=%APP_HOME%\logs\errors.log -arg3 some more parameters 

%APP_HOME%是一個系統變量設置爲值 「d:/路徑/到/程序」。

我得到的錯誤是這樣的:有關無法打開日誌之一或「相關文件」

應用特定的錯誤消息: d:/路徑/到/程序\日誌。錯誤號= 13,權限被拒絕

Java的我正在使用這樣的外觀:

Runtime.getRuntime().exec(cmdStr); 

哪裏cmdStr是包含命令在上述字符串。現在,我知道的事情是;

  1. 我真正應該使用重載的Runtime.exec(字符串[])方法
  2. 該命令使用的前一組合和反斜槓

這些都是有效的意見,我可能會最終解決問題,但我想解決的是爲什麼完全相同的代碼失敗只有在4臺機器中有3臺。

是的,命令中提到的所有路徑都存在於該框中。

它變得更奇怪。如果我執行以下(非常相似)的命令,它可以在所有四個框中正常工作。

cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=D:\path\to\program\logs\errors.log -arg3 some more parameters 

在上述工作版本,該唯一的區別是%APP_HOME%參考已被替換爲-errorlogname參數的絕對路徑。但是變量已經留在可執行文件的位置。

現在,相同的代碼在一個盒子上運行良好的事實讓我懷疑問題不是Java代碼。同樣,斜槓方向的混合我不認爲是一個問題,因爲這種混合在一臺機器上工作。

在我看來,它應該在每臺機器上都失敗。不只是其中之一。很顯然,如果一切都完全相同,它會在每臺機器上破壞(或工作)。但是我認爲所有的東西都是一樣的。

其他人可以提出其他建議嗎?

非常感謝。

+0

每個框上的%APP_HOME%的值是多少?您是否確信每臺計算機上都安裝了相同版本的可執行文件,並且具有相同的用戶設置和文件權限? – AndyT 2011-04-07 16:07:26

+0

您是否在所有機器上的命令行中嘗試了命令,如果您能重現問題,那肯定不是java問題...... – pgras 2011-04-07 16:35:02

回答

2

我懷疑%APP_HOME%實際上沒有設置在發生故障的機器上,但是您正好在正確的目錄中啓動腳本,以使可執行文件的相對路徑工作。要進一步調試,您將不得不通過打印出來驗證%APP_HOME%是否具有正確的值。

+0

這是一種可能性,我必須測試一個。我懷疑%APP_HOME%是相同的,因爲Java代碼是由腳本啓動的(在所有框上都是相同的)。但我會檢查看看。感謝您的建議。 – Tom 2011-04-07 16:27:40

相關問題