FileNotFound包含.jar和JSSE

时间:2015-04-02 03:42:08

标签: java file jsse

我正在使用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)

我一直试图想出这几个小时没有运气。任何帮助将不胜感激。

2 个答案:

答案 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());
}

帮自己一个忙,将其作为您将 密钥文件放在哪里的参考点。这将为您节省无数个小时,试图找出您获得NullPointerExceptionFileNotFoundException的原因。