我使用的是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这两个URL都在Eclipse中工作,客户端成功地执行握手。但是,当我将其导出为.jar文件时,会得到一个FileNotFoundException:
> java.io.FileNotFoundException:
> file:/Users/Zack/Downloads/iComputer.jar!/res/server.public (No
> such file or directory)几个小时以来,我一直在设法弄清楚这件事,却没有运气。任何帮助都将不胜感激。
发布于 2015-04-02 12:52:00
好的,下面是我为解决这个问题所做的工作(感谢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"和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());
}帮你自己一个忙,用它作为放置密钥文件的参考点。这将节省您数不清的时间,试图找出您为什么要得到一个NullPointerException或FileNotFoundException。
发布于 2015-04-02 13:03:50
资源不是文件,不能用FileInputStream.打开,只需将资源作为流来打开,完全摆脱FileInputStream和所有的名称处理。
https://stackoverflow.com/questions/29404615
复制相似问题