Подтвердить что ты не робот

Создание автономной банки с использованием SBT

Я был тяжелым пользователем Maven, и теперь я постепенно использую SBT для некоторых своих проектов.

Я хотел бы знать, как использовать SBT для создания автономного Java-проекта? Этот проект должен быть упакован как файл JAR, и этот JAR файл будет использоваться как зависимость в другом проекте SBT.

В Maven я могу сказать в своем pom.xml, какой тип артефакта он должен произвести, когда я его создаю. Есть ли что-то подобное в SBT?

4b9b3361

Ответ 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 ".