Статьи

ScalaFX, Scala Build Tool и библиотеки JavaFX 2.0

В моей последней записи в блоге, 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"

Мне было бы очень интересно ваше мнение об этой схеме выше. Заранее спасибо.

С http://www.xenonique.co.uk/blog/?p=528