Christian Fries created ZEPPELIN-2375:
-----------------------------------------

             Summary: Some interpreters (md) fail with 
java.lang.IncompatibleClassChangeError is CLASSPATH is set
                 Key: ZEPPELIN-2375
                 URL: https://issues.apache.org/jira/browse/ZEPPELIN-2375
             Project: Zeppelin
          Issue Type: Bug
          Components: Interpreters, zeppelin-server
    Affects Versions: 0.7.1, 0.7.0, 0.6.2, 0.8.0
         Environment: macOS Sierra (OS X) Version 10.12.3, Java 1.7 to Java 1.8 
(1.7u80, 1.8u121), Maven 3.2.5 or 3.3.9
            Reporter: Christian Fries


The issue is a follow-up of https://issues.apache.org/jira/browse/ZEPPELIN-2370 
- clarifying the reasons.

When the CLASSPATH variable is set in bash (even if it is empty), some zeppelin 
interpreters fail (on OS X). The error occurs if you run
{code}
export CLASSPATH=
./bin/zeppelin.sh
{code}
and then try to execute the md interpreter, e.g. via
{code}
%md
*Test*
{code}

I then get the following error
{code}
java.lang.IncompatibleClassChangeError: class org.objectweb.asm.tree.ClassNode 
has interface org.objectweb.asm.ClassVisitor as super class
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at 
org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:43)
        at 
org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:38)
        at org.parboiled.Parboiled.createParser(Parboiled.java:54)
        at 
org.pegdown.plugins.PegDownPlugins$Builder.withPlugin(PegDownPlugins.java:126)
        at 
org.apache.zeppelin.markdown.PegdownParser.<init>(PegdownParser.java:35)
        at 
org.apache.zeppelin.markdown.Markdown.createMarkdownParser(Markdown.java:75)
        at org.apache.zeppelin.markdown.Markdown.open(Markdown.java:85)
        at 
org.apache.zeppelin.interpreter.LazyOpenInterpreter.open(LazyOpenInterpreter.java:70)
        at 
org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:483)
        at org.apache.zeppelin.scheduler.Job.run(Job.java:175)
        at 
org.apache.zeppelin.scheduler.ParallelScheduler$JobRunner.run(ParallelScheduler.java:162)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
{code}

A further investigation showed that setting CLASSPATH will change the classpath 
of an interpreter. Running the following Scala code in Zeppelin prints the 
classpath of the Scala interpreter (which could/should differ from the 
classpath of the Zeppelin server):
{code}
    def urlses(cl: ClassLoader): Array[java.net.URL] = cl match {
      case null => Array()
      case u: java.net.URLClassLoader => u.getURLs() ++ urlses(cl.getParent)
      case _ => urlses(cl.getParent)
    }

    val  urls = urlses(getClass.getClassLoader)
    println(urls.mkString("\n"))
{code}

If CLASSPATH is set, then we find
{code}
zeppelin-0.7.1-bin-all/lib/asm-3.1.jar
{code}
in the interpreter classpath (and many other jars in 
zeppelin-0.7.1-bin-all/lib/).

However, if CLASSPATH is unset, then only jars from 
zeppelin-0.7.1-bin-all/lib/interpreter/ are found in the interpreters 
classpath. To check this, stop zeppelin and run
{code}
unset CLASSPATH
./bin/zeppelin.sh
{code}
and repeat the tests above.




--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to