Search code examples
javatomcatsambavfsapache-commons-vfs

ClassNotFoundException: org.apache.commons.vfs.provider.FileProvider


I'm using the vfs2 (not vfs) to access ftp. Now I also use the smb protocol but it does not work. I always get the Exception:

ClassNotFoundException: org.apache.commons.vfs.provider.FileProvider

But as I'm using vfs2 it is weird that it searches for classes with commons.vfs.provider and not commons.vfs2.provider - because in vfs2 the class exists.

Do I miss a library (jar)?

I have at the moment: commons-vfs2-2.0.jar, commons-vfs2-sandbox-2.0.jar (had to be added to find smb protocol), jcifs-1.3.17.jar, commons-net-3.3.jar, commons-collections-3.2.1.jar, commons-logging-1.1.1.jar and may more..

Here my complete StackTrace:

org.apache.commons.vfs2.FileSystemException: Could not create a file system manager of class "org.apache.commons.vfs2.impl.StandardFileSystemManager".
    at org.apache.commons.vfs2.VFS.createManager(VFS.java:99)
    at org.apache.commons.vfs2.VFS.getManager(VFS.java:50)
    at com.avintis.framework.service.DbAccessImpl.saveArchiveData(DbAccessImpl.java:1188)
    at com.avintis.framework.service.DbAccessImpl.saveMessageData(DbAccessImpl.java:905)
    at com.avintis.framework.service.DbAccessImpl.saveMessage(DbAccessImpl.java:417)
    at com.avintis.framework.service.ImportTrackingMsgServiceImpl.importFile(ImportTrackingMsgServiceImpl.java:77)
    at com.avintis.framework.service.ImportTrackingMsgServiceImpl.importFile(ImportTrackingMsgServiceImpl.java:30)
    at com.avintis.framework.watcher.service.WatcherServiceImpl.addTrackingMessages(WatcherServiceImpl.java:87)
    at com.avintis.framework.watcher.service.WatcherServiceImpl.watchForFiles(WatcherServiceImpl.java:34)
    at com.avintis.framework.schedule.WatcherJob.executeInternal(WatcherJob.java:30)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/vfs/provider/FileProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2854)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.createInstance(StandardFileSystemManager.java:485)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.addProvider(StandardFileSystemManager.java:371)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.configure(StandardFileSystemManager.java:270)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.configure(StandardFileSystemManager.java:195)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.configurePlugins(StandardFileSystemManager.java:154)
    at org.apache.commons.vfs2.impl.StandardFileSystemManager.init(StandardFileSystemManager.java:126)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.commons.vfs2.VFS.createManager(VFS.java:88)
    ... 12 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.vfs.provider.FileProvider
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    ... 30 more

Solution

  • In the first sight it looks like you need the commons-vfs.jar not the commons-vfs2-2.0.jar because the packagename in commons-vfs2-2.0.jar is org.apache.commons.vfs2.provider.jar. But this may cause problems with mixing up vfs and vfs2 classes and not work.

    So make sure you have following jars (only vfs2) loaded:

    • commons-vfs2-2.0.jar
    • commons-vfs2-sandbox-2.0.jar
    • jcifs-1.3.17.jar
    • And other depending commons (net, logging,...)

    Then also add the vfs-providers.xml inside your META-INF pointing to the correct class for the SmbFileProvider:

    <provider class-name="org.apache.commons.vfs2.provider.smb.SmbFileProvider">
        <scheme name="smb"/>
        <if-available class-name="jcifs.smb.SmbFile"/>
    </provider>