2012-01-27 15 views
12

Jak tworzysz projekt Scala SWT w SBT?Scala SWT z SBT

wiem, że można korzystać z repozytoriów Git:

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

Ale nie wiem, w jaki sposób i czy jest to możliwe z SWT.

Z góry dzięki, Etam.

EDIT:

musiałem pobrać go ręcznie. Kompiluje ale podczas uruchamiania pojawia Nieprawidłowy błąd dostępu wątek:

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

Nawet jeśli używam:

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

Jest to główne klasy:

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 
} 

Dzięki znowu Etam.

+0

Czy znalazłeś rozwiązanie tego problemu? – mariosangiorgio

Odpowiedz

6

Myślę, że najprostszym sposobem jest pobranie pliku JAR SWT z docelowej platformy, umieszczenie go pod folderem lib/ i będzie działać poprawnie.

+0

Próbuję uniknąć tego rozwiązania;). Ale dzięki. – Etam

+2

Mam teraz problem z błędem dostępu do nieprawidłowego wątku ... Czy mógłbyś obejrzeć moją edycję? – Etam

2

Napotkałem ten sam błąd dostępu do wątku, który zrobiłeś. Wydaje się, że pochodzi z sbt uruchamiania aplikacji jako pod-proces w tej samej maszynie JVM, jak działa sbt.

Rozwiązałem go poprzez budowanie słoik, a następnie uruchomić mój wniosek ręcznie:

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

Nie może być bardziej eleganckie rozwiązanie, ale przynajmniej masz mnie tak daleko, jak jest w stanie uruchomić mój wniosek.

10

dodać go do 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" 
} 

To będzie pierwszy dodać rozpoznawania nazw dla repozytorium SWT artefakt. Następnie wykryje wersję systemu operacyjnego i pobierze odpowiedni plik JAR.

Jeśli chodzi o problem z dostępem do wątku, rozwiązałem to w systemie Mac OS X, używając JDK 1.6 z nim - kiedy podaję tam -XstartOnFirstThread, to działa dobrze. Nie znalazłem rozwiązania dla JDK 1.7.

+0

Czy możesz mi powiedzieć, jak mam ustawić odpowiednią wersję JDK? Po uruchomieniu 'sbt' otrzymuję komunikat' Witaj w Scala w wersji 2.9.1.final (Java HotSpot (TM) 64-Bit Server VM, Java 1.6.0_35). 'Ale nadal nie działa dla mnie. Dodałem zależność, którą zasugerowałeś i ustaw 'javaOptions: = Seq (" - XstartOnFirstThread "," -d64 ")'. – mariosangiorgio

+0

Zwykle robię to na poziomie basha, mam skrypt, który robi to dla mnie: 'JAVA_HOME =/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home' ' JDK_HOME = $ JAVA_HOME' 'PATH = $ JAVA_HOME/bin: $ PATH', więc gdy uruchomi się 'sbt', pobiera domyślną Javę z' PATH'. – axel22

+0

Jednak wydajesz się już używać java 1.6. Nie jestem pewien, ale możliwe jest, że '-XstartOnFirstThread' nie zostanie pobrane z' javaOptions'. Zwykle uruchamiam moją aplikację osobno przez skrypt, a nie przez sbt, więc nie miałem tego problemu. Gdzie ustawiasz 'javaOptions',' build.sbt' lub w katalogu 'project'? – axel22