【问题标题】:How do I use JCIFS with apache VFS to access an SMB URL - part 2?如何使用 JCIFS 和 apache VFS 访问 SMB URL - 第 2 部分?
【发布时间】:2015-03-02 23:23:23
【问题描述】:

我遇到了同样的问题: How do I use JCIFS with apache VFS to access an SMB URL?

...在类路径中包含 commons-vfs-sandbox-2.1-SNAPSHOT.jar 后,我现在得到了这个异常:

Exception in thread "main" org.apache.commons.vfs2.FileSystemException: Could not determine the type of file "smb://10.10.18.210/CIFS/123/asd".
    at org.apache.commons.vfs2.provider.AbstractFileObject.attach(AbstractFileObject.java:1522)
    at org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:489)
    at org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477)
    at VFSTest.main(VFSTest.java:19)
Caused by: jcifs.smb.SmbAuthException: Logon failure: account currently disabled.
    at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:549)
    at jcifs.smb.SmbTransport.send(SmbTransport.java:667)
    at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)
    at jcifs.smb.SmbSession.send(SmbSession.java:218)
    at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
    at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
    at jcifs.smb.SmbFile.connect(SmbFile.java:954)
    at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
    at jcifs.smb.SmbFile.queryPath(SmbFile.java:1335)
    at jcifs.smb.SmbFile.exists(SmbFile.java:1417)
    at jcifs.smb.SmbFile.isDirectory(SmbFile.java:1490)
    at org.apache.commons.vfs2.provider.smb.SmbFileObject.createSmbFile(SmbFileObject.java:118)
    at org.apache.commons.vfs2.provider.smb.SmbFileObject.doAttach(SmbFileObject.java:70)
    at org.apache.commons.vfs2.provider.AbstractFileObject.attach(AbstractFileObject.java:1505)
    ... 3 more

请指教。

【问题讨论】:

  • 这个错误似乎不言自明。你有什么问题?
  • 我正在使用纯 JCIFS API 成功写入文件。只是我无法通过 commons-vfs 做到这一点。问题是 vfs api“无法确定文件 smb://... 的类型”。为什么?
  • 为什么?该错误是(引用):“引起:jcifs.smb.SmbAuthException:登录失败:帐户当前已禁用。”。
  • 正如我所说,我可以使用 jcifs-1.17 API 以相同的帐户、相同的凭据成功完成此操作。该帐户绝对没有被禁用。 apache vfs smb 提供程序有问题。我可能错过了一个罐子,但我不知道是哪一个。请看:stackoverflow.com/questions/11612690/…
  • 不,它看起来不像 JAR 问题。它看起来更像是一个配置问题。你是如何指定用户名的? bTW:你不会把 VFS 2.0 和 smb-provider 2.1 混在一起,对吧?

标签: java apache smb jcifs apache-commons-vfs


【解决方案1】:

我想我知道你的问题是什么,沙盒提供程序没有在 2.0 中自动注册。而且您还需要在解析调用中实际使用配置的身份验证属性(请参阅下面的修改源)。

我通常不使用默认文件系统管理器,而是动态注册我的提供程序,但如果您想使用自动检测,则需要将 vfs-providers.xml 添加到沙箱 JAR。

这是您使用 2.0 构建完整工作 JAR 的方式:

> git clone https://github.com/apache/commons-vfs.git -b commons-vfs2-project-2.0 vfs2.0
> cd vfs2.0
> notepad sandbox\pom.xml
> notepad sandbox\src\test\java\org\apache\commons\vfs2\provider\smb\test\StandaloneMain.java
> mvn -Pinclude-sandbox -DskipTests=true clean package dependency:tree

当您编辑 sandbox/pom.xml 时,您需要确保从 标记中删除 -SANDBOX。然后你需要添加:

  <resource>
    <directory>src/main/resources</directory>
  </resource>

到已经存在的 标记(就在第一个 LICENSE+NOTICE 之后包括第 88 行)

这是使用的测试代码:

package org.apache.commons.vfs2.provider.smb.test;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.VFS;
import org.apache.commons.vfs2.auth.StaticUserAuthenticator;
import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder;


public class StandaloneMain
{
    public static void main(String[] args) throws FileSystemException {
        //jcifs.Config.registerSmbURLHandler();
        StaticUserAuthenticator auth = new StaticUserAuthenticator("DOMAIN", "eckenfel", "SECRET");
        FileSystemOptions opts = new FileSystemOptions();
        DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
        FileSystemManager fs = VFS.getManager();
        if (!fs.hasProvider("smb")) throw new RuntimeException("Provide missing");
        System.out.println("Connecting " + args[0] + " with " + opts);
        FileObject smbFile = fs.resolveFile(args[0], opts); // added opts!
        System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime());
    }
}

这是执行:

> set REP=C:\Users\USERNAME\.m2\repository
> java -cp sandbox\target\commons-vfs2-sandbox-2.0.jar;^
           core\target\commons-vfs2-2.0.jar;^
           %REP%\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;^
           %REP%\jcifs\jcifs\0.8.3\jcifs-0.8.3.jar;^
           sandbox\target\test-classes
       org.apache.commons.vfs2.provider.smb.test.StandaloneMain smb://HOST/Users
Jan 05, 2015 2:40:19 PM org.apache.commons.vfs2.VfsLog info
INFORMATION: Using "C:\Users\USERNAME\AppData\Local\Temp\vfs_cache" as temporary files store.
Connecting smb://eckenfels02/Users with org.apache.commons.vfs2.FileSystemOptions@27dd2ec5
true 0

【讨论】:

  • 太棒了!非常感谢您的详细回答。它的工作原理!实际上,事实证明问题出在我的源代码中 - 我错过了添加 opts: FileObject smbFile = fs.resolveFile(args[0], opts); // 添加了选项!
  • 我刚刚修复了丢失的 vfs-provider.xml (VFS-552) 到主干,它将在 2.1 中
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2023-03-29
  • 2018-02-15
  • 2022-01-17
  • 2011-07-07
相关资源
最近更新 更多