scala/scala-parser-combinators

Under Scala 2.13.3, get java.lang.NoClassDefFoundError: scala/Serializable

plaurent opened this issue · 2 comments

Hi,

When building from the latest release (scala-parser-combinators_2.12-1.1.2-SNAPSHOT.jar) and running under Scala 2.13.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_251), the simple test example compiles fine but I get java.lang.NoClassDefFoundError: scala/Serializable while running it:

import scala.util.parsing.combinator._
class SimpleParser extends RegexParsers {
  def word: Parser[String]    = """[a-z]+""".r ^^ { _.toString }
}

object TestSimpleParser extends SimpleParser {
  def main(args: Array[String]) = println(parse(word, "johnny come lately"))
}

Here's the output

$ scala TestSimpleParser
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Serializable
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
	at java.lang.Class.getMethod0(Class.java:3018)
	at java.lang.Class.getMethod(Class.java:1784)
	at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:101)
	at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:97)
	at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:130)
	at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:29)
	at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:28)
	at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:43)
	at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:35)
	at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:34)
	at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:70)
	at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:91)
	at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
	at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
	at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: scala.Serializable
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 29 more

Any suggestions on how to use this library with the latest version of Scala?

Scala versions are epoch.major.minor, and major versions aren't binary compatible with each other in either direction, as per https://docs.scala-lang.org/overviews/core/binary-compatibility-of-scala-releases.html . You cannot use a library built for 2.12 on 2.13, or vice versa. Thus, on 2.13, you need scala-parser-combinators_2.13 (not scala-parser-combinators_2.12).

If you are building the library yourself, do ++2.13.3 first, followed by publishLocal.

Thanks!