当前位置: 首页 > 知识库问答 >
问题:

“URI不是分层的”私钥

陈飞
2023-03-14

我刚开始在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个答案

梁烨烨
2023-03-14

这不是你阅读资源的方式。您无法获取资源的文件,只能获取流。资源的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);
}

并将文件的路径传递给jsch。

 类似资料:
  • 我需要用我的代码打开一个视频文件,它在Eclipse中运行得非常好,但是当我导出到一个可运行的JAR中时,我会得到一个错误“URI不分层”。 我见过有人建议使用getResourceAsStream(),但我在使用桌面时需要一个文件对象。getDesktop。打开(文件)。有人能帮我吗? 以下是代码: 如果有帮助,我的文件夹列表如下 > src 视频 编辑:我计划只在windows上运行,并使用l

  • 我需要获取一个文件对象(不是流)来传递给库。我得到的是“URI不是分层的”。我见过一些解决方案,但它们要么效率很低,要么使用外部库。 File myFile=新文件(MyClass.class.getClassLoader()。getResource(目录)。toURI()) 顺便说一下,我需要传递到的对象 Lucene FSDirectory。打开(myFile) 有什么想法吗?

  • 问题内容: 我已将我的应用程序部署到jar文件。当我需要将数据从一个资源文件复制到jar文件外部时,请执行以下代码: 我遇到的错误是:URI is not hierarchical。在IDE中运行时,我不会遇到此错误。 如果我将上述代码更改为对StackOverFlow上其他帖子的一些帮助,请执行以下操作: 问题答案: 你不能做这个 它不是文件!从ide运行时,不会有任何错误,因为你没有运行jar

  • 问题内容: 我得到一个例外:“ URI方案不是文件” 我正在做的是尝试获取文件名,然后将该文件(从另一个服务器)从servlet中保存到我的计算机/服务器上。 我有一个名为“ url”的字符串,从这里开始是我的代码: 导致错误的行是这一行: 我添加了其余的代码,以便您可以看到我正在尝试执行的操作。 问题答案: URI“ scheme”是位于“:”前面的内容 错误消息告诉您仅适用于“文件:” URI

  • 本文向大家介绍ThinkPHP中的MVC分层是什么?相关面试题,主要包含被问及ThinkPHP中的MVC分层是什么?时的应答技巧和注意事项,需要的朋友参考一下 MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在: 模型(M):模型的定义由Model类来完成。 控

  • 我正试图使用AppRole身份验证从保险库中检索机密。但我得到了一个错误: IllegalArgumentException:URI不是绝对的 我使用spring-vault-core-2.2.0.release 下面是我的代码: 如果尝试获取vaultToken,也会出现相同的错误: