2015-04-02 30 views
0

我使用JSSE和有下面的代碼:FileNotFound與.jar和JSSE

private static void setupServerKeystore() throws GeneralSecurityException, IOException { 
     mServerKeyStore = KeyStore.getInstance("JKS"); 
     mServerKeyStore.load(new FileInputStream(iComputer.class.getClassLoader().getResource("res/server.public").getPath()), 
          "pswd".toCharArray()); 
} 


private static void setupClientKeyStore() throws GeneralSecurityException, IOException { 
      mClientKeyStore = KeyStore.getInstance("JKS"); 
      mClientKeyStore.load(new FileInputStream(iComputer.class.getClassLoader().getResource("res/client.private").getPath()), 
            mPassphrase.toCharArray()); 
} 

這裏是我的文件夾結構:

- iComputer 
    - src 
     - com 
      - ... 
     - res 
      - server.public 
      - client.private 

在Eclipse兩個URL的工作,並在客戶端執行握手成功。但是,當我出口這是一個.jar文件,我得到一個FileNotFoundException異常:

> java.io.FileNotFoundException: 
> file:/Users/Zack/Downloads/iComputer.jar!/res/server.public (No 
> such file or directory) 

我一直在試圖弄清楚這一點對於沒有運氣小時。任何幫助將非常感激。

+0

嘗試unzip -l iComputer.jar並確保您的結構是正確的。如果一切看起來不錯,你用什麼命令來執行它? – 2015-04-02 04:50:01

+0

而不是嘗試創建一個'FileInputStream',只需使用'getResourceAsStream'(而不是'getResource')並使用返回的'InputStream' – 2015-04-02 05:20:14

+0

@peeskillet,已經認爲這是一個選項。出於某種原因,我得到了一個「錯誤錯誤:sun.security.validator.ValidatorException:沒有發現可信任的證書」 – Zack 2015-04-02 11:40:57

回答

0

好的,所以這是我做了什麼來解決這個問題(感謝peeskillet提出的解決方案)。我認爲使用getResourceAsStream().這個選項在Eclipse中可以正常工作,但問題是我在導出和運行jar文件時出現錯誤,"error error: sun.security.validator.ValidatorException: No trusted certificate found".看起來好像我給了它錯誤的路徑。

JSSE的KeyStore.load()方法將接受任何類型的InputStream,如文檔中所示。它不一定是一個FileInputStream。

所以,這裏是我的文件結構:

- iComputer 
    - src 
     - com 
      - ... 
     - res 
      - server.public 
      - client.private 

基於關閉此文件結構,即正常工作是"res/server.public"爲Eclipse和JAR文件的路徑。因此,這裏有我的修訂從我的OP代碼:

private static void setupServerKeystore() throws GeneralSecurityException, IOException { 
     mServerKeyStore = KeyStore.getInstance("JKS"); 
     mServerKeyStore.load(iComputer.class.getClassLoader().getResourceAsStream("res/server.public"), 
          "pswd".toCharArray()); 
    } 

private static void setupClientKeyStore() throws GeneralSecurityException, IOException { 
     mClientKeyStore = KeyStore.getInstance("JKS"); 
     mClientKeyStore.load(iComputer.class.getClassLoader().getResourceAsStream("res/client.private"), 
           mPassphrase.toCharArray()); 
} 

幫自己一個忙,以此爲參考點,在那裏你把你的關鍵文件(S)。這將爲您節省數不清的時間,試圖找出您爲什麼得到NullPointerExceptionFileNotFoundException

1

資源不是文件,不能用FileInputStream.打開只需將資源作爲流獲取,並且完全清除FileInputStream和所有名稱處理。