我刚开始在我的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(系统找不到指定的文件)"。我在代码或任何其他建议中应该修改什么吗?
答案 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。