2015-11-19 6 views
0

Я немного новичок в взаимодействии между java и scala. Я хочу вызвать объект-компаньон в Scala с Java.Вызов сопутствующего объекта scala из java

Файловая структура (в текущем каталоге):

Board.scala 
Matching.java 
lib/scala-library.jar 
lib/scala-swing_2.11-1.0.1.jar 

Matching.java

public class Matching{ 
 
    
 
    public void startGame(){ 
 
    new Board(); 
 
    } 
 
    public static void main (String[] args){ 
 
    Matching newGame = new Matching(); 
 
    newGame.startGame(); 
 
    } 
 
}

Board.scala

import scala.swing._ 
 

 
class Board extends MainFrame { 
 
    title = "Matching Game" 
 
    contents = new GridPanel(3, 2) { 
 
    contents += new Label("Test Label") 
 
    contents += new Button("Test Button1") 
 
    contents += new Button("Test Button2") 
 
    contents += new Button("Test Button3") 
 
    contents += new CheckBox("Check1") 
 
    contents += Button("Close") { sys.exit(0) } 
 
    } 
 
    visible = true; 
 
} 
 
object Board { 
 
def main(args: Array[String]) { 
 
    val ui = new Board 
 
    ui.visible = true 
 
    } 
 
}

Командная строка:

scalac Board.scala 
 
javac Matching.java 
 

 
java -cp /lib/*.jar:. Matching

Однако после запуска, терминал дает:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/swing/MainFrame 

Единственно делать: scalac Board.scala; scala Board работает отлично. Я что-то забыл? Надеюсь, я правильно свяжу банки. Спасибо!

Edit: Трассировка стека исключений

java -cp 'lib/*.jar:.' Matching 
 
Exception in thread "main" java.lang.NoClassDefFoundError: scala/swing/MainFrame 
 
\t at java.lang.ClassLoader.defineClass1(Native Method) 
 
\t at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
 
\t at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
 
\t at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
 
\t at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
 
\t at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
 
\t at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
 
\t at java.security.AccessController.doPrivileged(Native Method) 
 
\t at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
 
\t at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
 
\t at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
 
\t at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
 
\t at Matching.startGame(Matching.java:4) 
 
\t at Matching.main(Matching.java:8) 
 
Caused by: java.lang.ClassNotFoundException: scala.swing.MainFrame 
 
\t at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
 
\t at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
 
\t at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
 
\t at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
 
\t ... 14 more 
 
make: *** [run] Error 1

+0

Не является частью MainFrame scala.swing._? –

+0

Yup: «java -cp /lib/*.jar :. Matching» должен позаботиться обо всех баночках, насколько мне известно. –

+0

Это '*' сложно. Вероятно, вам придется процитировать его так, чтобы оболочка не расширила его. 'java -cp '/lib/*j.jar :.' Соответствие' http://stackoverflow.com/a/13609448/14955 – Thilo

ответ

0

Fixed его! Надеюсь это поможет!

scalac Board.scala 
javac -cp lib/*:. Matching.java 
java -cp lib/*:. Matching 
Смежные вопросы