Commons VFS和Java.net.URL – 增加对“sftp://”协议的支持

我们正在尝试使用Apache Commons VFS通过SFTP访问某些内容。 它声称支持SFTP ,但是,当它启动时,我们会得到一个MalformedURLException 。 挖掘我看到,Apache vfs使用java.net.URL 。 但是文档告诉我,它实际上并不支持sftp:// URL。

以下协议的协议处理程序保证存在于searchpath中:

  http, https, ftp, file, and jar 

用于附加协议的协议处理程序也可用。

我在Linux上使用java 1.6.0。 如何防止java.net.URL在看到sftp:// URL时抛出一个不稳定的东西? 我需要继续使用Apache commons VFS库,它使用java.net.URL

Solutions Collecting From Web of "Commons VFS和Java.net.URL – 增加对“sftp://”协议的支持"

请参阅commons-vfs sftp工作所需的依赖关系列表。 一旦JSch在类路径中,你的异常就不会再发生了。 看看Apache的维基通过sftp连接的例子。

我从来没有使用过VFS,但看起来你需要(至少) 注册一个SFTP FileProvider 。 它看起来像需要像这样的东西:

 DefaultFileSystemManager fsm = ... /* Create and configure your FSM. */ fsm.addProvider("sftp", new SftpFileProvider()); 

有可能通过配置文件语法来做同样的事情。

看看这个关于如何实现一个新的URL协议处理器的描述(该文档描述了一种LDAP类型的URL,但是你应该能够推广到你的sftp方案)。

从文件:

正如你所看到的,这两个例子的唯一区别就是我们在第二种情况下使用了一个LDAP URL。 但是,为了运行LDAP示例,首先必须注册IAIK-JCE的LDAP协议处理程序,以告知java.net URL框架在哪里查找 IAIK-JCE 的LDAP支持类

System.getProperties().put("java.protocol.handler.pkgs", "iaik.x509.net");

在注册了IAIK LDAP协议处理程序之后,在为URL URL调用url.openConnection时,将返回IAIK-JCE LdapURLConnection对象。

(重点是我的)

我用jsch来处理sftp和ssh。 它不会帮助你防止来自java.net.URL的异常,但它会帮助你做sftp的东西。

根据代码结构的不同,可以在将字符串赋给URL解析方法之前删除s,设置一个标志,如果验证通过,则检查该标志,如果已设置,则将其置回。 这是丑陋的,但它会提供一个解决方法。