Java &引用;URI不是分层的”+;私钥
我刚开始在Java程序(为Windows7制作)中使用Jsch进行SSH连接。我遇到了一个问题,将私钥合并到我的程序中。我使用以下代码:Java &引用;URI不是分层的”+;私钥,java,eclipse,windows,jsch,Java,Eclipse,Windows,Jsch,我刚开始在Java程序(为Windows7制作)中使用Jsch进行SSH连接。我遇到了一个问题,将私钥合并到我的程序中。我使用以下代码: URL keyFileURL = Main.class.getResource("auth/public_key_1"); URI keyFileURI = keyFileURL.toURI(); jsch.addIdentity(new File(keyFileURI).getAbsolutePath()); 其中“auth”是同一软件包中的文件夹。好消息
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(系统找不到指定的文件)”。代码或其他建议中有什么我应该修正的吗?这不是阅读资源的方式。您无法获取资源的
文件,只能获取流。资源的URL与文件不对应
如果jsch可以处理流,则将getResourceAsStream
的结果传递给它
如果jsch可以处理一个字节数组,那么将读取流的结果传递给它一个字节数组
如果它必须有一个文件,创建一个临时文件
在第三种情况下,我会合并番石榴并编写如下代码:
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);
}
并将文件的路径传递给jsch。谢谢您的回复。Jsch在处理私钥时使用字符串(请不要问我为什么)。我尝试了您的示例代码(合并的番石榴),但我遇到了“createByteSink”的问题,因为它给出了一个未定义的错误。糟糕的是,它是“asByteSink”。已编辑。抱歉,最后一期。“createTempFile”也给了我一个未定义的错误。我真的应该为此创建一个方法吗?更新(没有为其他人编辑)。将“createTempFile”重命名为“File.createTempFile”尝试了该代码,不幸的是它给了我一个“系统找不到指定的文件”错误。我会再看一看,看能不能让它工作。你知道还有什么可以用的吗?再次感谢你的帮助。