В этой заметке мы познакомися с утилитой 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((xxxJInt(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 )