我正在使用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)
我一直试图想出这几个小时没有运气。任何帮助将不胜感激。
答案 0 :(得分:1)
资源不是文件,无法使用FileInputStream.
打开。只需将资源作为流,然后完全删除FileInputStream
和所有名称处理。
答案 1 :(得分: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
基于此文件结构,Eclipse和JAR文件的正确路径"res/server.public"
。所以,这是我对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
的原因。