Commons VFS和Java.net.URL - 添加对"sftp://"协议的支持

16
我们正在尝试使用Apache Commons VFS来访问SFTP上的内容。它声称支持SFTP, 但是当它启动时,我们遇到了一个MalformedURLException异常。仔细查看后发现,Apache VFS正在使用java.net.URL。然而,文档告诉我它实际上并不支持sftp:// URL。

Protocol handlers for the following protocols are guaranteed to exist on the search path :-

    http, https, ftp, file, and jar

Protocol handlers for additional protocols may also be available.

我正在Linux上使用Java 1.6.0。当java.net.URL看到一个sftp://的URL时,我该如何防止它抛出异常?我需要继续使用Apache commons VFS库,该库使用java.net.URL


你是如何创建SFTP连接的?使用Sftp客户端工厂还是其他什么方式? - Yishai
5个回答

23

查看依赖项列表,这些依赖是commons-vfs在使用sftp时所需的。一旦将JSch放入类路径中,您的异常就不会再发生了。请参阅Apache的Wiki,以获取通过sftp进行连接的示例。


1
安装JSch并将其自动包含在我的jar文件中,神奇地解决了所有问题。 - Amandasaurus
我在pom.xml中添加了依赖<groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.51</version>。但问题仍然存在,有什么想法吗? - Eric Lundmark
谢谢,你救了我的一天! - oli206

4

我以前从未使用过VFS,但是看起来你需要(至少)注册一个SFTP 文件提供者它似乎需要类似于:

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

可能可以通过配置文件语法完成相同的事情。


3
请查看this description,了解如何实现一个新的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协议处理程序之后,调用LDAP URL的url.openConnection时将返回一个IAIK-JCE LdapURLConnection对象。

(强调我的)


2

我使用jsch来处理sftp和ssh。它不能帮助您防止java.net.URL的异常,但它可以帮助您完成sftp操作。


我需要使用Apache Commons VFS模块,但我不想重写其核心部分。 - Amandasaurus

1
根据您的代码结构,您可以在将字符串传递给URL解析方法之前删除s,设置一个标志,如果它验证通过,则检查该标志并在设置时将其放回。这很丑陋,但它会提供一种解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接