2012-01-27 24 views
12

Come si crea il progetto Scala SWT in SBT?Progetto Scala SWT con SBT

So che è possibile utilizzare i repository GIT:

RootProject(uri("http://git.eclipse.org/gitroot/platform/eclipse.platform.swt.binaries.git")) 

Ma io non so come e se è possibile con SWT.

Grazie in anticipo, Etam.

EDIT:

ho dovuto scaricare manualmente. Compila ma durante l'esecuzione ottengo non valido errore di accesso alla discussione:

***WARNING: Display must be created on main thread due to Cocoa restrictions. 
[error] (run-main) org.eclipse.swt.SWTException: Invalid thread access 

Anche se uso:

javaOptions := Seq("-XstartOnFirstThread", "-d64") 

Questa è la classe principale:

import org.eclipse.swt._ 
import org.eclipse.swt.layout._ 
import org.eclipse.swt.widgets._ 

object Main extends App { 
    val display = new Display 
    val shell = new Shell(display) 
    shell.setLayout(new GridLayout()) 
    shell.pack 
    shell.open 
    while (!shell.isDisposed) { 
     if (!display.readAndDispatch) 
      display.sleep 
    } 
    display.dispose 
} 

Grazie ancora, Etam.

+0

Hai trovato una soluzione a questo problema? – mariosangiorgio

risposta

6

Penso che il modo più semplice sia scaricare il file jar SWT della piattaforma di destinazione, metterlo nella cartella lib/ e funzionerà correttamente.

+0

Sto cercando di evitare questa soluzione;). Ma grazie. – Etam

+2

Ora ho un problema con l'errore di accesso al thread non valido ... Puoi guardare la mia modifica? – Etam

2

Ho riscontrato lo stesso errore di accesso al thread che si è verificato. Sembra che sbt lanci la tua applicazione come sottoprocesso nella stessa JVM di quanto è in esecuzione sbt.

ho risolto con la costruzione di un barattolo, e quindi eseguire la mia applicazione manualmente:

scala -classpath "target/scala-2.9.1/foobar-0.0.1.jar:lib/swt-debug.jar" -J"-XstartOnFirstThread" foo.bar.HelloWorld 

Ci potrebbe essere una soluzione più elegante, ma almeno questo mi ha fatto fino ad essere in grado di eseguire la mia applicazione.

10

Aggiungi questo al vostro build.sbt:

resolvers += "swt-repo" at "http://maven-eclipse.github.io/maven" 

libraryDependencies += { 
    val os = (sys.props("os.name"), sys.props("os.arch")) match { 
    case ("Linux", _) => "gtk.linux.x86" 
    case ("Mac OS X", "amd64" | "x86_64") => "cocoa.macosx.x86_64" 
    case ("Mac OS X", _) => "cocoa.macosx.x86" 
    case (os, "amd64") if os.startsWith("Windows") => "win32.win32.x86_64" 
    case (os, _) if os.startsWith("Windows") => "win32.win32.x86" 
    case (os, arch) => sys.error("Cannot obtain lib for OS '" + os + "' and architecture '" + arch + "'") 
    } 
    val artifact = "org.eclipse.swt." + os 
    "org.eclipse.swt" % artifact % "4.6.1" 
} 

Sarà innanzitutto aggiungere un resolver per il repository SWT manufatto. Rileverà quindi la versione del sistema operativo e scaricherà un JAR appropriato.

Per quanto riguarda il problema di accesso al thread, ho risolto questo problema su Mac OS X utilizzando JDK 1.6 con esso - quando ho specificato -XstartOnFirstThread lì, funziona correttamente. Non ho trovato alcuna soluzione per JDK 1.7.

+0

Puoi dirmi come dovrei impostare la giusta versione di JDK? All'avvio di 'sbt ', ricevo questo messaggio' Benvenuti in Scala versione 2.9.1.final (Java Server HotSpot (TM) 64-Bit Server, Java 1.6.0_35) .', ma non funziona ancora per me. Ho aggiunto la dipendenza suggerita e impostato 'javaOptions: = Seq (" - XstartOnFirstThread "," -d64 ")'. – mariosangiorgio

+0

Di solito lo faccio a livello bash, ho uno script che fa questo per me: 'JAVA_HOME =/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home' ' JDK_HOME = $ JAVA_HOME' 'PATH = $ JAVA_HOME/bin: $ PATH', quindi quando viene eseguito 'sbt', preleva il predefinito Java dal' PATH'. – axel22

+0

Tuttavia, sembra che stia già usando java 1.6. Non sono sicuro, ma è possibile che '-XstartOnFirstThread' non venga prelevato da' javaOptions'. Di solito eseguo la mia applicazione separatamente tramite script e non tramite sbt, quindi non ho avuto questo problema. Dove imposti 'javaOptions',' build.sbt' o nella cartella 'project'? – axel22