2011-04-13 45 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