Создание автономной банки с использованием SBT
Я был тяжелым пользователем Maven, и теперь я постепенно использую SBT для некоторых своих проектов.
Я хотел бы знать, как использовать SBT для создания автономного Java-проекта? Этот проект должен быть упакован как файл JAR, и этот JAR файл будет использоваться как зависимость в другом проекте SBT.
В Maven я могу сказать в своем pom.xml
, какой тип артефакта он должен произвести, когда я его создаю. Есть ли что-то подобное в SBT?
Ответы
Ответ 1
Существует различие между автономным и использование проекта в качестве зависимости или другого проекта. В первом случае вы должны использовать плагин, например sbt-assembly. Он будет создавать один файл jar, содержащий файлы классов проекта, а также все его зависимости. Если вы пишете приложение, то вы получаете двунаправленную банку, которую вы можете выполнить из любого места.
Если вы хотите использовать свой проект A как зависимость для другого проекта B, у вас есть разные варианты. Вы можете просто упаковать файлы классов A, используя sbt package
(ответ @Channing Walton). Затем вы можете удалить полученный файл .jar
в каталог lib
проекта B. Однако, если A также требует библиотеки, вы должны убедиться, что они также попадают в библиотеки проекта B.
Лучший подход - опубликовать ваш проект. Вы можете сделать это только на своей локальной машине, используя sbt publish-local
. Это будет хранить банку, созданную package
в специальном локальном каталоге, к которому можно получить доступ из sbt в другом проекте, вместе с POM файлом, который содержит зависимости A. Он будет использовать идентификатор группы (group) и артефакт -ID (имя) и версия вашего проекта A. Например, в build.sbt
:
name := "projecta"
version := "0.1.0-SNAPSHOT"
organization := "com.github.myname"
scalaVersion := "2.10.3"
publishMavenStyle := true
После публикации с помощью sbt publish-local
вы можете добавить в свой проект следующую зависимость B:
libraryDependencies += "com.github.myname" %% "projecta" % "0.1.0-SNAPSHOT"
Если у вас есть чистый Java-проект, вы можете опустить суффикс версии Scala, т.е. в Project A:
crossPaths := false
autoScalaLibrary := false
И затем в Project B:
libraryDependencies += "com.github.myname" % "projecta" % "0.1.0-SNAPSHOT"
(используя только один символ %
между идентификатором группы и артефактом).
Подробнее о публикации в документации sbt.
Ответ 2
'sbt package' создаст файл jar.
Если вы хотите, чтобы он исполнялся, вам нужно добавить следующее в конфигурацию .sbt:
mainClass in Compile := Some("your.main.Class")
Ответ 3
Конечно, вы можете использовать команду "sbt package", он создает файл jar, но этот банку будет без каких-либо зависимостей. Чтобы запустить его, необходимо указать "classpath" arg для библиотек.
В вашем случае вам нужен автономный исполняемый файл. И вам нужно добавить зависимости.
Для этого вы можете использовать плагин 'assembly' для SBT, см. https://github.com/sbt/sbt-assembly/
После этого вы можете просто запустить команду 'sbt assembly', она предоставит файл jar со всеми зависимостями, которые вы можете развернуть и запустить в любом месте и в любое время.
Подробнее см. в статье .
Ответ 4
publishLocal
создает артефакт и публикует в локальном репозитории Ivy, что делает его доступным для ваших локальных зависимостей проекта.
publishM2
то же самое, что и выше, но артефакт публикуется в локальном репозитории Maven вместо Ivy repo.
Ответ 5
Я думаю, что самый простой способ создать отдельную банку с вашим проектом в ней,
грустно не лежит внутри sbt.
Я лично использую свою IDE: Intellij, чтобы сделать банку (через функцию "build artifact" ).
Благодаря Intellij я могу легко выбрать, какую библиотеку я хочу включить в банку или нет (например, scala stl).
IMHO, это, безусловно, самый простой способ получить исполняемый банку для вашего проекта.
Если вы поместите scala stl, вы можете запустить свою банку с помощью команды "java -jar", если нет, вам нужно запустить ее где-нибудь с правильной версией scala, установленной с помощью scala ".