“URI不是分层的”+私钥

时间:2014-09-14 20:40:55

标签: java eclipse windows jsch

我刚开始在我的Java程序(为Windows 7制作)中使用Jsch进行SSH连接。我遇到了一个将私钥加入我的程序的问题。我使用以下代码:

URL keyFileURL = Main.class.getResource("auth/public_key_1");
URI keyFileURI = keyFileURL.toURI();
jsch.addIdentity(new File(keyFileURI).getAbsolutePath());

凡" auth"是同一个包中的文件夹。好消息是,在Eclipse中运行它时一切正常,但是当它作为jar运行时它会失败。给出的错误是:" IllegalArgumentException:URI不是分层的"。

我知道错误与路径名和使用URI作为文件有关,但是我不知道如何在没有外部导入的情况下引用jar文件中的资源(即从与jar相同的文件夹中的文件) )并且仍然与Jsch兼容。

有人可以帮助我使用代码来适当地引用程序中的资源,并且仍然让Jsch接受它作为密钥。

提前感谢您提供任何帮助。

更新

我试过@bmargulies推荐代码:

    String authfile;

     URL resUrl = Resources.getResource(Main.class, "auth/public_key_1");
     File tempFile = File.createTempFile("key", ".key");
     ByteSink sink = Files.asByteSink(tempFile);
     try (OutputStream os = sink.openStream()) {
         Resources.copy(resUrl, os);
         authfile = os.toString();
         jsch.addIdentity(authfile);
     }

但是它给了我错误:" java.io.FileOutputStream(系统找不到指定的文件)"。我在代码或任何其他建议中应该修改什么吗?

1 个答案:

答案 0 :(得分:3)

这不是你阅读资源的方式。您无法为资源获取File,只能获得流。资源的URL与文件不对应。

如果jsch可以处理流,请将结果传递给getResourceAsStream

如果jsch可以处理一个字节数组,则将读取流的结果传递给一个字节数组。

如果必须有文件,请创建临时文件。

在第三种情况下,我将合并Guava并编写如下代码:

URL resUrl = Resources.getResource(Main.class, "auth/public_key1");
File tempFile = File.createTempFile("key", ".key");
ByteSink sink = Files.asByteSink(tempFile);
try (OutputStream os = sink.openStream()) {
    Resources.copy(resUrl, os);
}

并将File的路径传递给jsch。