Научился собирать код на Scala с помощью SBT
13 марта 2013
В этой заметке мы познакомися с утилитой sbt. Мы научимся собирать с ее помощью проекты на Scala, устанавливать сторонние библиотеки, а также узнаем, как собрать jar, который будет работать на любой машине, где есть Java, без установки каких-либо зависимостей. Напоминаю, что установка sbt была рассмотрена в посте, опубликованном в этот понедельник.
Важно! В мире Scala все меняется очень быстро и сия заметка уже слегка устарела. На данный момент рекомендуется использовать другой механизм подключения плагинов к sbt. См исходники к посту Работа с Excel-файлами в Scala.
Перейдем в новый каталог и создадим в нем файл build.sbt:
version := "0.1"
scalaVersion := "2.9.2"
Обратите внимание, что пустые строки значимы. Если о них забыть, sbt будет ругаться непонятными сообщениями об ошибках.
В каталог src/main/scala/me/eax/twitsearch кладем файл twitsearch.scala из предыдущей заметки. Несмотря на то, что sbt с тем же успехом скомпилирует программу, если положить twitsearch.scala в одном каталоге с build.sbt, лучше сразу приучать себя делать правильно. В реальном проекте вы же не станете складывать сотни файлов с расширением scala в одном каталоге, правда?
Теперь программу можно собрать с помощью sbt:
Чтобы запустить программу, воспользуйтесь командой:
Если программе требуется передать какие-то аргументы, что как раз есть наш случай, возьмите их в кавычки вместе с «run»:
Если проект состоит из нескольких программ, вы можете выбрать, какую из них запускать, воспользовавшись командой run-main:
Часто требуется запустить REPL в контексте текущего проекта:
Также sbt поддерживает непрерывную компиляцию. Это когда программа компилируется сразу при обнаружении изменений в ее исходном коде. На первый взгляд это может показаться не самой полезной функцией, но на практике она существенно ускоряет разработку:
Теперь попробуем собрать standalone jar. В этом нам поможет плагин для sbt под названием sbt-assembly.
Создаем файл project/project/build.scala следующего содержания:
object Plugins extends Build {
lazy val root = Project("root", file(".")) dependsOn(
uri("git://github.com/sbt/sbt-assembly.git#0.8.6")
)
}
В начало build.sbt дописываем:
assemblySettings
Теперь говорим:
Если все было сделано правильно, в каталоге target появится файл с именем twitsearch-assembly-0.1.jar. Можно проверить его работоспособность, выполнив команду:
Самое прекрасное, что в этот файл включаются все сторонние библиотеки и тп. То есть, для работы ему не нужно ничего, кроме обычной JVM. Конечно, если только в вашем проекте не используется Java Native Interface.
Кстати, о птичках. Давайте попробуем использовать в проекте какую-нибудь стороннюю библиотеку, например json4s. Для этого дописываем в конец build.sbt строчку:
Командой sbt console
запускаем REPL и смотрим на библиотеку в действии:
import org.json4s._
scala> import org.json4s.native.JsonMethods._
import org.json4s.native.JsonMethods._
scala> parse("{\"xxx\":123}")
res4: org.json4s.package.JValue = JObject(List((xxx,JInt(123))))
Благодаря json4s, а также дополнению @ya_kostya к предыдущей заметке, мы можем переписать наш код следующим образом:
import java.net._
import org.json4s._
import org.json4s.native.JsonMethods._
object Application extends App {
if(args.isEmpty) {
println("Usage: twitsearch <query>")
exit(1)
}
val query = URLEncoder.encode(args(0), "UTF-8")
val url = "http://search.twitter.com/search.json?q=" + query
val json = parse(Source.fromURL(url).mkString)
(json \ "results" \ "text" \\ classOf[JString]).foreach(println)
}
Смотрите, как здорово! Никаких type erasure, уродливых asInstanceOf и даже вложенных сопоставлений с образцом.
Осталось только решить маленькую проблему. Если вы сидите под Ubuntu и ваш домашний каталог зашифрован, то во время сборки standalone jar вы получите ошибку:
Но это решается довольно просто:
mkdir /tmp/`echo $$`
ln -s /tmp/`echo $$` ./target
Вот так легко и непринужденно пишутся программы на Scala. Все исходники к посту вы найдете в этом архиве.
Дополнение: Как отправить электронное письмо в Scala
Метки: Scala, Функциональное программирование.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.