Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;URI不是分层的”+;私钥_Java_Eclipse_Windows_Jsch - Fatal编程技术网

Java &引用;URI不是分层的”+;私钥

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”是同一软件包中的文件夹。好消息

我刚开始在Java程序(为Windows7制作)中使用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(系统找不到指定的文件)”。代码或其他建议中有什么我应该修正的吗?

这不是阅读资源的方式。您无法获取资源的
文件,只能获取流。资源的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”尝试了该代码,不幸的是它给了我一个“系统找不到指定的文件”错误。我会再看一看,看能不能让它工作。你知道还有什么可以用的吗?再次感谢你的帮助。