VFS方法不能处理在jboss-beans.xml
中配置的URI ${jboss.server.temp.dir}/local/outgoing
,它被JBoss解析为"C:\Download\jboss-eap-5.1.1\server\default\tmp/local/outgoing"
。当我尝试解析URI并获取文件时,它抛出了一个异常。知道是什么问题吗?
Exception
17:35:25,024 ERROR [VfsSynchronizerConfImpl] File FromOutgoing cannot be resolved, FileSystemException:
org.apache.commons.vfs2.FileSystemException: Could not find file with URI "C:Downloadjboss-eap-5.1.1serverdefaulttmp/local/outgoing" because it is a relative path, and no base URI was provided.
at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:719)
at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:649)
at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:605)
DefaultFileSystemManager.class methods
public FileObject resolveFile(final String uri) throws FileSystemException
-- this method calls the method below
public FileObject resolveFile(final FileObject baseFile, final String uri,
final FileSystemOptions fileSystemOptions)
throws FileSystemException
-- this method cannot process the string and throws
throw new FileSystemException("vfs.impl/find-rel-file.error", uri);
很老的问题,但很流行。这个例外非常普遍。对于我的情况,这个异常是在上传文件到远程ftp服务器时抛出的。根本原因是类路径中缺少sftp库。在此异常之前,vfs
尝试使用与URI
中提到的方案相对应的提供程序之一来解析文件。
在我的例子中,scheme是sftp
,并且它试图在类路径上找到jsch
库。由于它不存在于我的类路径中,因此抛出了此异常。因此,必须将提供程序jar放在类路径上。
@Manish Bansal -感谢您对这个问题的回复。我尝试了一切,但仍然得到同样的错误:异常在线程"main"filesystemexception:找不到文件的uri "sftp://....."因为它是一个相对路径,并且没有提供基uri。
在我的MAVEN项目中,我必须添加对'jsch' &它工作。
所以,简而言之,我添加了以下POM依赖:<!-- SFTP -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.6.0</version>
</dependency>
public void downloadFile() throws IOException {
FileSystemManager manager = VFS.getManager();
FileObject remote = manager.resolveFile(createConnectionString("XYZ.com","ABC","LMNOP","/<FOLDER_NAME>/<FILE_NAME>"));
FileObject local = manager.resolveFile(System.getProperty("user.dir") + "/" + "src//main//resources//");
local.copyFrom(remote, Selectors.SELECT_SELF);
local.close();
remote.close();
}
public static URI createConnectionString(String hostName, String username, String password, String remoteFilePath) {
URI sftpURI = null;
try {
String userInfo = username + ":" + password;
sftpURI = new URI("sftp",userInfo,hostName,-1,remoteFilePath,null,null);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sftpURI;
}
对于面临此问题的其他人:我通过替换
来消除此错误。FileSystemManager fsManager = VFS.getManager();
StandardFileSystemManager fsManager = new StandardFileSystemManager();
fsManager.init();
这允许我多次使用文件系统管理器而不会再出现问题中描述的错误。用完后别忘了关闭fsManager
:
fsManager.close();
只是试图补充已经提供的正确答案。
简而言之:检查VFS依赖表中使用的VFS特性。
我遇到了一个类似的问题,当我第一次尝试通过FTP
连接(不是SFTP在原来的问题)。我使用Maven和IntelliJ IDEA。
我浏览了VFS官方文档,发现了以下内容:
- 一些VFS项目依赖项是可选的,默认不安装
- 什么可以需要安装在VFS下载&;构建页面。
事实上,SFTP
需要JSch
,FTP
需要Apache Commons Net
,等等。
当我通过Maven安装Commons Net
时,我的FTP连接已经开始工作了。
EDIT 2023:也就是说,添加你的pom.xml
:
<!-- FTP -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version>
</dependency>
我认为它需要file: scheme,因为错误说它被认为是相对的