You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Barak Kedem (JIRA)" <ji...@apache.org> on 2016/08/11 11:44:20 UTC

[jira] [Commented] (VFS-424) VFS 2.0 class loading breaks in OSGi, regression from 1.0

    [ https://issues.apache.org/jira/browse/VFS-424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15417073#comment-15417073 ] 

Barak Kedem commented on VFS-424:
---------------------------------

[~b.eckenfels]
I am facing the same error even on version 2.1 

org.apache.commons.vfs2.FileSystemException: Could not load VFS configuration from "jar:file:/C:/Users/User/.m2/repository/org/apache/commons/commons-vfs2/2.1/commons-vfs2-2.1.jar!/org/apache/commons/vfs2/impl/providers.xml".
java.util.concurrent.ExecutionException: org.apache.commons.vfs2.FileSystemException: Could not load VFS configuration from "jar:file:/C:/Users/User/.m2/repository/org/apache/commons/commons-vfs2/2.1/commons-vfs2-2.1.jar!/org/apache/commons/vfs2/impl/providers.xml". 
at java.util.concurrent.FutureTask.report(FutureTask.java:122) 
at java.util.concurrent.FutureTask.get(FutureTask.java:206) 


> VFS 2.0 class loading breaks in OSGi, regression from 1.0
> ---------------------------------------------------------
>
>                 Key: VFS-424
>                 URL: https://issues.apache.org/jira/browse/VFS-424
>             Project: Commons VFS
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Apache Maven 3.0.4 (r1232337; 2012-01-17 03:44:56-0500)
> Maven home: C:\Java\apache-maven-3.0.4\bin\..
> Java version: 1.6.0_31, vendor: Sun Microsystems Inc.
> Java home: C:\Program Files\Java\jdk1.6.0_31\jre
> Default locale: en_US, platform encoding: Cp1252
> OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
>            Reporter: Gary Gregory
>            Assignee: Bernd Eckenfels
>             Fix For: 2.1
>
>
> Class loading changed between version 1.0 and 2.0 in org.apache.commons.vfs2.impl.StandardFileSystemManager.init()
> This breaks our app server running under OSGi (Equinox) like this:
> {noformat}
> 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.seagullsw.toolbox.config.ConfigurationDirectory.resolveFileObject(ConfigurationDirectory.java:315)
>     at com.seagullsw.toolbox.config.Configuration.resolveFileObject(Configuration.java:135)
> <Snip: ...my app frames...>
>     at com.seagullsw.appinterface.server.osgi.JCicsOsgiTestCase.testJcicsOsgiRoundtrip(JCicsOsgiTestCase.java:226)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>     at java.lang.reflect.Method.invoke(Unknown Source)
>     at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:307)
>     at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
>     at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
>     at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
>     at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
>     at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
>     at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
>     at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
>     at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
>     at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
>     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: org.apache.commons.vfs2.FileSystemException: Could not load VFS configuration from "bundleresource://7.fwk545215872:34/org/apache/commons/vfs2/impl/providers.xml".
>     at org.apache.commons.vfs2.impl.StandardFileSystemManager.configure(StandardFileSystemManager.java:199)
>     at org.apache.commons.vfs2.impl.StandardFileSystemManager.init(StandardFileSystemManager.java:123)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>     at java.lang.reflect.Method.invoke(Unknown Source)
>     at org.apache.commons.vfs2.VFS.createManager(VFS.java:88)
>     ... 49 more
> Caused by: java.lang.ClassCastException: org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider cannot be cast to org.apache.commons.vfs2.provider.FileProvider
>     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)
>     ... 55 more
> {noformat}
> Which I work around with this hack:
> {code:java}
>     private void initVfs() {
>         StandardFileSystemManager fsm = new StandardFileSystemManager();
>         fsm.setClassLoader(fsm.getClass().getClassLoader());
>         try {
>             FieldUtils.writeDeclaredStaticField(VFS.class, "instance", fsm, true);
>             fsm.init();
>         } catch (FileSystemException e) {
>             ...
>         } catch (IllegalAccessException e) {
>             ...
>         }
>     }
> {code}
> Two questions:
> (1) Why is org.apache.commons.vfs2.VFS.getManager() coded with a class name ref instead of the a real Class object or an actual instance:
> {code:java}
>     public static synchronized FileSystemManager getManager()
>         throws FileSystemException
>     {
>         if (instance == null)
>         {
>             instance = createManager("org.apache.commons.vfs2.impl.StandardFileSystemManager");
>         }
>         return instance;
>     }
> {code}
> Why not:
> {code:java}
>     public static synchronized FileSystemManager getManager()
>         throws FileSystemException
>     {
>         if (instance == null)
>         {
>             instance = new StandardFileSystemManager();
>             // where the StandardFileSystemManager constructor calls init();
>         }
>         return instance;
>     }
> {code}
> If not, what about adding a setManager(FileSystemManager)?
> This did not happen in 1.0, it worked fine in OSGi.
> In 1.0, the init() method is:
> {code:java}
>     public void init() throws FileSystemException
>     {
>         // Set the replicator and temporary file store (use the same component)
>         final DefaultFileReplicator replicator = createDefaultFileReplicator();
>         setReplicator(new PrivilegedFileReplicator(replicator));
>         setTemporaryFileStore(replicator);
>         if (classLoader == null)
>         {
>             // Use default classloader
>             classLoader = getClass().getClassLoader();
>         }
>         if (configUri == null)
>         {
>             // Use default config
>             final URL url = getClass().getResource(CONFIG_RESOURCE);
>             if (url == null)
>             {
>                 throw new FileSystemException("vfs.impl/find-config-file.error", CONFIG_RESOURCE);
>             }
>             configUri = url;
>         }
>         // Configure
>         configure(configUri);
>         // Configure Plugins
>         configurePlugins();
>         // Initialise super-class
>         super.init();
>     }
> {code}
> In 2.0, the init() method is:
> {code:java}
>     public void init() throws FileSystemException
>     {
>         // Set the replicator and temporary file store (use the same component)
>         final DefaultFileReplicator replicator = createDefaultFileReplicator();
>         setReplicator(new PrivilegedFileReplicator(replicator));
>         setTemporaryFileStore(replicator);
>         /* replaced by findClassLoader
>         if (classLoader == null)
>         {
>             // Use default classloader
>             classLoader = getClass().getClassLoader();
>         }
>         */
>         if (configUri == null)
>         {
>             // Use default config
>             final URL url = getClass().getResource(CONFIG_RESOURCE);
>             if (url == null)
>             {
>                 throw new FileSystemException("vfs.impl/find-config-file.error", CONFIG_RESOURCE);
>             }
>             configUri = url;
>         }
>         // Configure
>         configure(configUri);
>         // Configure Plugins
>         configurePlugins();
>         // Initialise super-class
>         super.init();
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)