2011-04-13 41 views
1

我運行下面的代碼代碼時:問題使用來自jar文件

public class Sign { 

private static final PrivateKey   priv = Util.loadPrivate(); 
private static final PublicKey   pub  = Util.loadPublic(); 
private static final HexBinaryAdapter adp  = new HexBinaryAdapter(); 

public static String sign(String in) { 
    try { 
     Signature sign = Signature.getInstance(Util.ALG); 
     sign.initSign(priv); 
     sign.update(in.getBytes()); 
     return adp.marshal(sign.sign()); 

    } catch (Exception e) {e.printStackTrace();} 
    return null; 
} 

public static boolean verify(String data, String sign) { 
    try { 
     Signature verify = Signature.getInstance(Util.ALG); 
     verify.initVerify(pub); 
     verify.update(data.getBytes()); 
     return verify.verify(adp.unmarshal(sign)); 
    } catch (Exception e) {e.printStackTrace();} 
    return false; 
} 

}

和主要功能如下:

public static void main(String[] args) { 
    String in = "lala"; 
    String sign = Sign.sign(in); 
    System.out.println(sign); 
    System.out.println(Sign.verify(in, sign)); 
} 

一切順利的話,當我運行它來自Eclipse內部(輸出爲「true」),但是當我將它打包到jar(沒有主函數)並運行它時,輸出是錯誤的。

這是我的加載項:

public static PrivateKey loadPrivate() { 
    try { 
     URLConnection con = Util.class.getResource("private.key").openConnection(); 
     byte[] bs = new byte[con.getContentLength()]; 
     con.getInputStream().read(bs); 
     return KeyFactory.getInstance(ALG).generatePrivate(new PKCS8EncodedKeySpec(bs)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

public static PublicKey loadPublic() { 
    try { 
     URLConnection con = Util.class.getResource("public.key").openConnection(); 
     byte[] bs = new byte[con.getContentLength()]; 
     con.getInputStream().read(bs); 
     return KeyFactory.getInstance(ALG).generatePublic(new X509EncodedKeySpec(bs)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

我檢查和加載項工作正常。

有什麼想法?

+0

我有一種感覺,問題是類路徑。你用什麼參數來執行主函數? – 2011-04-13 21:30:43

+0

請向我們展示'java'命令的參數,特別是類路徑設置。這些文件需要位於類路徑中才能找到。 Eclipse通常會爲你處理(BuildPath),但在命令行中輪到你了。 – Thomas 2011-04-13 22:39:48

回答

0

只要運行這樣的:

java Main -classpath=/path/to/libraryk.jar 
+0

Main.class ???這是行不通的。該參數預計是該類的規範名稱,而不是文件名。 – 2011-04-13 21:45:17

+0

然後放下.class,大家都很開心:) – 2011-04-14 07:40:28