В моей последней записи в блоге, ScalaFX A Walkthrough , я говорил о настройке ScalaFX 2.0 в IntelliJ 10.5 с помощью Scala Build Tool (SBT) в скриншоте. Я упустил некоторые существенные моменты.
В JavaFX 2.0 SDK есть одна важная жестко запрограммированная ссылка, которая затрудняет использование в репозитории Maven или Ivy. Ссылка находится в классе NativeLibLoader и пытается инициализировать собственную библиотеку с фиксированным путем. На самом деле вызов выглядит примерно так:
AccessController.doPrivileged(new PrivilegedAction() { public Object run() { NativeLibLoader.loadLibrary("mat"); return null; } });
Класс NativeLibLoader JavaFX 2.0 ожидает найти собственные библиотеки в «/../bin» пути к классу, который ссылается на jfxrt.jar.
Чтобы обойти эту проблему, вам необходимо вручную скопировать все собственные библиотеки JavaFX 2.0 (файлы * .DLL) в папки SBT.
Сначала создайте каталог:
cd scalafx mkdir lib_managed\jars\com.oracle\bin
Примечание: SBT использует Apache Ivy под капотом, поэтому в качестве имени пути используется своеобразное не-Maven имя группы «com.oracle».
Затем скопируйте нативные библиотеки поверх:
copy “%JAVAFX_HOME%”\rt\bin\*.dll lib_managed\jars\com.oracle\bin
После этого исправления для отсутствующей нативной библиотеки вы можете успешно собрать библиотеку ScalaFX, используя SBT:
SBT
> компилировать
> тест
> беги
> выход
Наконец, чтобы сгенерировать файл JAR, вы затем выполняете sbt:
sbt package sbt clean compile test package
Посмотрите в папке «target» для «scalafx-1.0.jar».
Вот некоторые фрагменты SBT, которые я добавил в свою версию файла build.sbt, который поможет вам настроить:
// Upgraded the latest Scala version from 2.9.0.1 to 2.9.1 scalaVersion := "2.9.1" // Harded code my local repository, because the following breaks Windows file resolution // resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository" resolvers += "Local Maven Repository" at "file:///Users/Peter/.m2/repository" // UPGRADE to JAVAFX 2.0 Final Candidate Status (FCS) libraryDependencies ++= Seq( "com.oracle" % "javafx-runtime" % "2.0" ) // Everyone should using Java 1.6 by now shouldn't they? javacOptions ++= Seq("-source", "1.6", "-target", "1.6") // Reduce the JVM heap space for my laptop! javaOptions += "-Xmx384M" // Change the JAVA home to something on your system, if required // javaHome := Some(file("/Library/Java/JavaVirtualMachines/1.6.0_24-b07-330.jdk/Contents/Home")) javaHome := Some(file("/Program Files/Java/jdk1.6.0_29" ))
Чтобы установить JAR в локальный репозиторий Maven, вам нужно добавить следующий раздел в файл build.sbt. Опять же, это не переносимо, поскольку оно напрямую отражает мою машину и мое пространство пользователя.
// Set publish Maven for local repository publishMavenStyle := true // Set up the Maven repository publishTo := Some(Resolver.file("file", new File( "/Users/Peter/.m2/repository" )) )
Теперь вы можете запустить команду SBT «опубликовать» следующим образом:
> опубликовать
[info] опубликовал скалаф на C: /Users/Peter/.m2/repository/org/scalafx/scalafx/1.0/scalafx-1.0.pom
[info] опубликовал скалаф на C: /Users/Peter/.m2/repository/org/scalafx/scalafx/1.0/scalafx-1.0.jar
[info] опубликовал скаляпы на C: /Users/Peter/.m2/repository/org/scalafx/scalafx/1.0/scalafx-1.0-sources.jar
Как вы можете видеть, это эквивалентно вызову mvn install: install-file почти.
Если вы хотите установить на локальный Apache Ivy, используйте вместо этого команду SBT «publish-local».
> sbt publish-local
[info] опубликовал scalafx в C: \ Users \ peter \ .ivy2 / local / org.scalafx / scalafx / 1.0 / poms / scalafx.pom
[info] опубликовал scalafx в C: \ Users \ peter \ .ivy2 / local / org.scalafx / scalafx / 1.0 / jars / scalafx.jar
[info] опубликовал scalafx в C: \ Users \ peter \ .ivy2 / local / org.scalafx / scalafx / 1.0 / srcs / scalafx-sources.jar
[info] опубликовал плющ в C: \ Users \ peter \ .ivy2 / local / org.scalafx / scalafx / 1.0 / ivys / ivy.xml
Пожалуйста, дайте мне знать, если у вас есть еще проблемы. Спасибо.
IntelliJ и SBT
В подключаемом модуле SBT для IntelliJ IDEA была определенная ошибка, которая не позволяла вводу командной строки работать более одного раза. Я объяснил это в видео ролике. Тем не менее, это было исправлено недавно, поэтому убедитесь, что вы обновили этот плагин, чтобы получить исправление.
Предложение
Это копирование руководств DLL является настоящей проблемой для разработчиков Maven / Ivy / SBT, потому что мы делаем это каждый отдельный проект. Я считаю, что Oracle может стандартизировать актуализированное имя «платформы» (например, «Win», «Mac», «Solaris», «Linux») для фактической загрузки или придумать способ сделать механизм косвенным. Позвольте мне совершенно ясно заявить:
// This SBT stanza will not work!!! It is just for illustration libraryDependencies ++= Seq( "com.oracle" % "javafx" % "2.0" % "provided" , ( "com.oracle" % "javafx-windows" % "2.0" % "provided" | "com.oracle" % "javafx-macosx" % "2.0" % "provided" | "com.oracle" % "javafx-solaris" % "2.0" % "provided" | "com.oracle" % "javafx-linux" % "2.0" % "provided" ) }
Поэтому собственные библиотеки Linux (файл * .so) находятся в известной папке репозитория, и, конечно, вы создаете файл POM или IVY и эти записи:
~/.m2/repository/com/oracle/javafx-linux
Мы знаем, что существуют подлинные различия в архитектуре ОС и ЦП, и даже в оборудовании микросхемы, и поэтому мы должны быть чувствительны к собственным изменениям, например, Windows 32 и 64-битная, а AMD / Intel может выглядеть следующим образом:
libraryDependencies ++= Seq( "com.oracle" % "javafx" % "2.0" % "provided" , "com.oracle" % "javafx-${PLATFORM}[-${VERSION}][-${ARCHITECTURE}][-${CHIPSET}]" % "2.0" % "provided" } // PLATFORM is "windows" and VERSION is "" or "7" or "8" // and ARCHITECTURE is "" or "32bit" or "64bit" // and also CHIPSET is "" or "Intel" or "AMD"
Мне было бы очень интересно ваше мнение об этой схеме выше. Заранее спасибо.