MovingBlocks / Terasology

Terasology - open source voxel world
http://terasology.org
Apache License 2.0
3.65k stars 1.33k forks source link

Need to add in Apache commons-vfs2 to fix a zip issue on a Linux server #1637

Open Cervator opened 9 years ago

Cervator commented 9 years ago

@minnesotags ran into this issue while trying to add a module from a zip file to a headless server on a Linux host:

18:44:40.339 [main] INFO  o.t.module.sandbox.ModuleClassLoader - Module path: /opt/terasology/Terasology50/modules/cheatsforall.zip
18:44:40.352 [main] WARN  org.reflections.Reflections - could not create Dir using commons_vfs2 from url file:/opt/terasology/Terasology50/modules/cheatsforall.zip. skipping.
java.lang.NoClassDefFoundError: org/apache/commons/vfs2/VFS
    at org.reflections.vfs.Vfs$DefaultUrlTypes$7.matches(Vfs.java:281) ~[reflections-0.9.9.jar:na]
    at org.reflections.vfs.Vfs.fromURL(Vfs.java:97) [reflections-0.9.9.jar:na]
    at org.reflections.vfs.Vfs.fromURL(Vfs.java:90) [reflections-0.9.9.jar:na]
    at org.reflections.Reflections.scan(Reflections.java:236) [reflections-0.9.9.jar:na]
    at org.reflections.Reflections.scan(Reflections.java:203) [reflections-0.9.9.jar:na]
    at org.reflections.Reflections.<init>(Reflections.java:128) [reflections-0.9.9.jar:na]
    at org.terasology.module.BaseModule.scanForReflections(BaseModule.java:139) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.BaseModule.getReflectionsFragment(BaseModule.java:132) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.ModuleEnvironment.<init>(ModuleEnvironment.java:98) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.ModuleEnvironment.<init>(ModuleEnvironment.java:77) [gestalt-module-2.2.3.jar:na]
    at org.terasology.engine.module.ModuleManager.loadEnvironment(ModuleManager.java:184) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.world.generator.internal.WorldGeneratorManager.refresh(WorldGeneratorManager.java:59) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.world.generator.internal.WorldGeneratorManager.<init>(WorldGeneratorManager.java:47) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.engine.TerasologyEngine.initManagers(TerasologyEngine.java:296) [engine-0.50.0.jar:50, origin/master, 2015-03-01_22-49-42]
    at org.terasology.engine.TerasologyEngine.<init>(TerasologyEngine.java:164) [engine-0.50.0.jar:50, origin/master, 2015-03-01_22-49-42]
    at org.terasology.engine.Terasology.main(Terasology.java:123) [Terasology.jar:50, origin/master, 2015-03-01_22-49-42]
Caused by: java.lang.ClassNotFoundException: org.apache.commons.vfs2.VFS
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_40]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_40]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_40]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_40]
    ... 16 common frames omitted
18:44:40.361 [main] WARN  org.reflections.Reflections - could not create Vfs.Dir from url. ignoring the exception and continuing
org.reflections.ReflectionsException: could not create Vfs.Dir from url, no matching UrlType was found [file:/opt/terasology/Terasology50/modules/cheatsforall.zip]
either use fromURL(final URL url, final List<UrlType> urlTypes) or use the static setDefaultURLTypes(final List<UrlType> urlTypes) or addDefaultURLTypes(UrlType urlType) with your specialized UrlType.
    at org.reflections.vfs.Vfs.fromURL(Vfs.java:108) ~[reflections-0.9.9.jar:na]
    at org.reflections.vfs.Vfs.fromURL(Vfs.java:90) ~[reflections-0.9.9.jar:na]
    at org.reflections.Reflections.scan(Reflections.java:236) [reflections-0.9.9.jar:na]
    at org.reflections.Reflections.scan(Reflections.java:203) [reflections-0.9.9.jar:na]
    at org.reflections.Reflections.<init>(Reflections.java:128) [reflections-0.9.9.jar:na]
    at org.terasology.module.BaseModule.scanForReflections(BaseModule.java:139) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.BaseModule.getReflectionsFragment(BaseModule.java:132) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.ModuleEnvironment.<init>(ModuleEnvironment.java:98) [gestalt-module-2.2.3.jar:na]
    at org.terasology.module.ModuleEnvironment.<init>(ModuleEnvironment.java:77) [gestalt-module-2.2.3.jar:na]
    at org.terasology.engine.module.ModuleManager.loadEnvironment(ModuleManager.java:184) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.world.generator.internal.WorldGeneratorManager.refresh(WorldGeneratorManager.java:59) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.world.generator.internal.WorldGeneratorManager.<init>(WorldGeneratorManager.java:47) [engine-0.50.0.jar:50, master, 2015-03-01_22-49-42, pre-alpha]
    at org.terasology.engine.TerasologyEngine.initManagers(TerasologyEngine.java:296) [engine-0.50.0.jar:50, origin/master, 2015-03-01_22-49-42]
    at org.terasology.engine.TerasologyEngine.<init>(TerasologyEngine.java:164) [engine-0.50.0.jar:50, origin/master, 2015-03-01_22-49-42]
    at org.terasology.engine.Terasology.main(Terasology.java:123) [Terasology.jar:50, origin/master, 2015-03-01_22-49-42]
18:44:40.364 [main] WARN  org.reflections.Reflections - given scan urls are empty. set urls in the configuration

It looks like we need to add an optional dependency for Reflections:

<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.0</version>

msteiger commented 9 years ago

Is this specific for Linux or a general problem? I never encountered that issue. Java 7 has a FileSystem for ZIP files - I wonder why org.reflections is not using that.

Quickly browsing through the JavaDoc resulted in:

org.reflections.vfs.Vfs.addDefaultURLTypes(new Vfs.UrlType() { ... } );

Maybe that can be used to plug in the ZIP file system, but maybe it's easiest to just add commons-vfs2 to the classpath.

minnesotags commented 9 years ago

It is possible the config.cfg had a syntax error preventing proper loading. I need to eliminate that variable. Will report back.

minnesotags commented 9 years ago

Also, I have to check, but I am fairly confident this machine has Java 8 installed.

Cervator commented 9 years ago

@minnesotags nah pretty sure the config.cfg was fine at that point. This is a code issue

@msteiger it never happened for me either, but then it is probably rare how often we've tried to load a module from a .zip before, renaming to .jar alone fixed it :-)

@immortius mentioned something about alternatively adding some sort of type handler, yeah, so that might do it too