2015-10-08 73 views
1

當我嘗試在Windows上以編程方式運行java -jar命令時,發生了一些奇怪的事情。錯誤:無法找到或加載主類?jar

當運行這樣的命令:

Process p = Runtime.getRuntime().exec(cmd); //cmd string is ok 
p.waitFor(); 

我得到的錯誤

Error: Could not find or load main class �jar

cmd VAR構造是這樣的:

cmd = String.format("java –jar %s –o win -i %s -n %s -d %s -s %s", jarLocation, param1, param2, tgtFilePath, srcFilePath); 

我試着調試這個問題,所以我複製粘貼命令到CMD並得到相同的錯誤。但是,當我手動鍵入而不復制粘貼時,一切正常。

當獲得每個String我得到的字節數:

字節生成的字符串的:

[106, 97, 118, 97, 32, -30, -128, -109, 106, 97, 114, 32, 110, 112, 116, 95, 108, 105, 99, 101, 110, 115, 101, 46, 106, 97, 114, 32, -30, -128, -109, 111, 32, 119, 105, 110, 32, 45, 105, 32, 104, 111, 115, 116, 105, 100, 55, 56, 57, 48, 49, 32, 45, 110, 32, 104, 111, 115, 116, 110, 97, 109, 101, 32, 45, 100, 32, 108, 105, 99, 101, 110, 99, 101, 70, 105, 108, 101, 45, 105, 110, 112, 117, 116, 76, 105, 99, 101, 110, 99, 101, 45, 114, 101, 115, 117, 108, 116, 46, 100, 97, 116, 32, 45, 115, 32, 108, 105, 99, 101, 110, 99, 101, 70, 105, 108, 101, 45, 105, 110, 112, 117, 116, 76, 105, 99, 101, 110, 99, 101]

字節硬編碼串的:

[106, 97, 118, 97, 32, 45, 106, 97, 114, 32, 110, 112, 116, 95, 108, 105, 99, 101, 110, 115, 101, 46, 106, 97, 114, 32, 45, 111, 32, 119, 105, 110, 32, 45, 105, 32, 104, 111, 115, 116, 105, 100, 55, 56, 57, 48, 49, 32, 45, 110, 32, 104, 111, 115, 116, 110, 97, 109, 101, 32, 45, 100, 32, 108, 105, 99, 101, 110, 99, 101, 70, 105, 108, 101, 45, 105, 110, 112, 117, 116, 76, 105, 99, 101, 110, 99, 101, 45, 114, 101, 115, 117, 108, 116, 46, 100, 97, 116, 32, 45, 115, 32, 108, 105, 99, 101, 110, 99, 101, 70, 105, 108, 101, 45, 105, 110, 112, 117, 116, 76, 105, 99, 101, 110, 99, 101]

的jarLocation是一個參數,該參數已經被硬編碼並且沒有被接收爲web服務參數。

什麼會導致這樣的問題?

+0

你的清單文件如何? – Stultuske

+0

'當我手動鍵入而不復制粘貼時,一切正常工作正常'是什麼意思? –

+0

我正在運行的是導致此問題的是Spring Web服務。那麼你的意思是pom.xml嗎?應該在那裏? –

回答

1

好,讓它更清楚我建議你應該做什麼。

修改你這樣的代碼

// this will be the command which produces �jar 
cmd = String.format("java –jar %s –o win -i %s -n %s -d %s -s %s", jarLocation, 
      param1, param2, tgtFilePath, srcFilePath); 
System.out.println(Arrays.toString(cmd.getBytes(charsetLatin1))); 

// this will be the working command, as you wrote 
cmd = "here you type the same command"; 
System.out.println(Arrays.toString(cmd.getBytes(charsetLatin1)));   

那麼你應該比較字節,並至少有差別。基於此,您可以進一步調查。

更新
查找可視化幾個不同的破折號,這一下在一些字體頗爲相似簡短的示例代碼。

import java.nio.charset.StandardCharsets; 

public class Dashes { 

    public static void main(String[] args) { 
     // see: https://en.wikipedia.org/wiki/Dash 
     byte[] enDash = {-30, -128, -109}; 
     byte[] minusSign = {45}; 
     byte[] emDash = {-30, -128, -108}; 

     byte[][] charBytes = new byte[3][]; 
     charBytes[0] = enDash; 
     charBytes[1] = minusSign; 
     charBytes[2] = emDash; 

     for (byte[] bytes : charBytes) { 
      String s = new String(bytes, StandardCharsets.UTF_8); 
      char c = s.charAt(0); 
      System.out.printf("%d %s %s%n", s.length(), c, Character.getName(c)); 
     } 
    } 
} 

您需要檢查生成值爲jarLocation的代碼。由於選項-jar-o包含EN DASH而不是HYPHEN-MINUS

從您的代碼的模式,通過copy'n'paste

byte[] b = "java –jar %s –o win -i %s -n %s -d %s -s %s".getBytes(); 
System.out.println(Arrays.toString(b)); 

輸出

[106,97,118,97,32,-30, -128, -109,106,97,114 ,32,37,115,32,-30, -128, -109,111,32,119,105,110,32,45,105,32,37,115,32,45,110,32,37,115,32,45,100 ,32,37,115,32,45,115,32,37,115]

Wh ICH顯示破折號前jaro不在jaro選項前面的HYPHEN-MINUS

溶液

卸下(EN DASH),然後再次輸入(如HYPHEN-MINUS)。

+0

好所以我做了你說的測試,並且即使在將它們粘貼到彼此旁邊時,字節也有差異,我得到的是相同的字符串。就像我當時說過的那樣......現在呢?所以我知道有一個區別,但我不知道如何處理它。 –

+0

@YonatanNir因爲你甚至沒有發佈不同的字節,你認爲我們可以提出什麼?您是否已經調查過您的webservice如何創建'jarLocation'值? – SubOptimal

+0

對於缺少的信息感到抱歉。我使用您要求查看的信息編輯了問題本身。差異從第6個字節開始,意思是'-jar'的' - '?不知道是否確實如此,可以做些什麼。 –

相關問題