Scala Проект SWT с SBT
Как вы создаете проект 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
}
Еще раз спасибо,
Etam.
Ответы
Ответ 1
Добавьте это в свой 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 для нее.
Что касается проблемы с доступом к потоку, я решил это на Mac OS X с помощью JDK 1.6 с ним - когда я укажу там -XstartOnFirstThread
, он работает нормально. Я не нашел решения для JDK 1.7.
Ответ 2
Я думаю, что самый простой способ - загрузить SWT файл jar вашей целевой платформы, поместить его в папку lib/
, и он будет работать нормально.
Ответ 3
Я столкнулся с той же ошибкой доступа к потоку, что и вы. Похоже, что sbt запускает ваше приложение в качестве подпроцесса в той же JVM, что и сам sbt.
Я решил это, построив банку, а затем запустил мое приложение вручную:
scala -classpath "target/scala-2.9.1/foobar-0.0.1.jar:lib/swt-debug.jar" -J"-XstartOnFirstThread" foo.bar.HelloWorld
Там может быть более элегантное решение, но это, по крайней мере, привело меня к возможности запуска моего приложения.