jcurses with scala ClassLoader.getSystemClassLoader().getResource()
returns NULL
I'm learning trying to learn scala this weekend and so decided to try to
write a simple text based game using java curses.
The scala code (simplified for the question submission) looks like:
import jcurses.widgets.Window
object testScala {
def main (args: Array[String]) {
val w = new Window(80, 24, true, "snake")
}
}
The program is compiled thus:
scalac -cp jcurses.jar:. n.scala
and run like so:
scala -cp jcurses.jar:. testScala
Which produces the following exception:
java.lang.NullPointerException
at jcurses.system.Toolkit.getLibraryPath(Toolkit.java:97)
at jcurses.system.Toolkit.<clinit>(Toolkit.java:37)
at jcurses.system.InputChar.<clinit>(InputChar.java:13)
at jcurses.widgets.Window.<clinit>(Window.java:209)
at testScala$.main(n.scala:5)
at testScala.main(n.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:71)
at
scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
at
scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:139)
at
scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:71)
at
scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:139)
at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:28)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:45)
at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:35)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:45)
at
scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
The offending code is:
String url =
ClassLoader.getSystemClassLoader().getResource("jcurses/system/Toolkit.class").toString();
Now, I've read a few posts about how getResource() here is relative to the
package root, so the above line looks fine to me since when I untar the
.jar file the same structure is revealed:
$ mkdir tmp && cp jcurses.jar tmp && cd tmp
$ jar xvf jcurses.jar
$ file jcurses/system/Toolkit.class
jcurses/system/Toolkit.class: compiled Java class data, version 50.0 (Java
1.6)
Next thing I did was hack up the same thing in Java, which works fine:
$ cat m.java import jcurses.widgets.Window;
public class m {
public static void main (String args[]) {
Window w = new Window(80, 24, true, "snake");
}
}
Then compile and run:
javac -cp jcurses.jar:. m.java
java -cp jcurses.jar:. m
Why does this work and the scala program does not? Has anyone got jcurses
to work with scala?
I've tried this on both linux (debian) and os x and neither works with scala.
Help!
No comments:
Post a Comment