2012-01-27 94 views
12

如何在SBT中創建Scala SWT項目?Scala SWT項目與SBT

我知道,你可以使用Git倉庫:

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

但我不知道是怎麼回事,如果是可能的SWT。

在此先感謝, Etam。

編輯

我不得不手動下載。它編譯,但在運行時我得到無效的線程訪問錯誤:

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

即使我使用:

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

這是主類:再次

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 
} 

感謝, 艾格。

+0

您是否找到解決此問題的解決方案? – mariosangiorgio 2012-09-19 21:56:57

回答

6

我覺得最簡單的方法就是下載你的目標平臺的SWT jar文件,把它放在lib/文件夾下,它會正常工作。

+0

我試圖避免這個解決方案;)。但是,謝謝。 – Etam 2012-01-27 17:08:44

+2

現在我遇到了無效線程訪問錯誤的問題...您能否看看我的編輯? – Etam 2012-02-17 23:04:12

2

我遇到了相同的線程訪問錯誤。它似乎來自sbt,在sbt本身運行的同一個JVM中作爲子進程啓動你的應用程序。

我解決它通過手動建立一個罐子,然後運行我的應用程序:

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

有可能是一個更好的解決方案,但是這至少讓我只要能夠運行我的應用程序。

10

添加到您的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" 
} 

它首先會添加一個解析器爲SWT神器庫。 然後,它會檢測您的操作系統版本併爲其下載適當的JAR。

至於線程訪問問題,我使用JDK 1.6在Mac OS X上解決了這個問題 - 當我在那裏指定-XstartOnFirstThread時,它工作正常。我沒有發現JDK 1.7的解決方案。

+0

你能告訴我應該如何設置正確的JDK版本嗎? 當'sbt'開始時,我得到這個消息'歡迎來到Scala版本2.9.1.final(Java HotSpot™64位服務器虛擬機,Java 1.6.0_35)「,但它仍然不適用於我。 我添加了你建議的依賴關係,並設置了'javaOptions:= Seq(「 - XstartOnFirstThread」,「-d64」)'。 – mariosangiorgio 2012-09-20 13:31:25

+0

我通常在bash級別上執行它,我有一個腳本可以爲我執行此操作:'JAVA_HOME =/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home' 'JDK_HOME = $ JAVA_HOME' 'PATH = $ JAVA_HOME/bin:$ PATH',所以當'sbt'運行時它會從'PATH'中選擇默認的Java。 – axel22 2012-09-20 13:36:58

+0

但是,您似乎已經使用了java 1.6。不確定,但可能'-XstartOnFirstThread'沒有從'javaOptions'中找到。我通常通過腳本單獨運行我的應用程序,而不是通過sbt,所以我沒有這個問題。你在哪裏設置'javaOptions','build.sbt'或者'project'目錄? – axel22 2012-09-20 13:48:23