2012-01-27 96 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