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

Как включить внешний файл jar в банку с пакетом?

Мой проект зависит от внешней банки. Я создал каталог lib и скопировал в него файл jar. Это мой build.sbt:

name := "approxstrmatch"

version := "1.0"

scalaVersion := "2.10.4"

unmanagedJars in Compile += file("lib/secondstring-20140729.jar")

libraryDependencies+="org.apache.spark"%%"spark-core"%"1.0.0"

resolvers += "AkkaRepository" at "http://repo.akka.io/releases/"

Когда я запускаю clean и package, внешний файл jar не включается в сгенерированный файл jar. Почему?

Это макет проекта:

project/build.sbt
lib/
src/.....
4b9b3361

Ответ 1

Попробуйте это

libraryDependencies += "com.acme.common" % "commonclass" % "1.0" from "file:///Users/bwong/git/perf-tools/commonclass/target/scala-2.11/commonclass_2.11-1.0.jar"

I "sbt package" представляет собой общий класс-проект, а затем просто добавьте эту зависимость библиотеки в мой build.sbt в зависимых проектах.

Благодаря http://flummox-engineering.blogspot.com/2014/06/sbt-use-jar-file-for-librarydependencies.html для этого взлома.

Ответ 2

Прежде всего, нет необходимости явно указывать unmanagedJars, если у вас нет более сложной конфигурации. Просто разместите файлы JAR в каталоге lib, и они будут добавлены в путь к классам (docs).

Чтобы упаковать исполняемый JAR со всеми необходимыми зависимостями, используйте один из плагинов SBT: sbt-onejar или sbt-assembly. package просто упаковывает ваши классы в банку и не заботится обо всех зависимостях.

Инструкции в документах плагинов должны быть легкими для указания того, как их использовать.

Ответ 3

Трюк заключается в том, чтобы выяснить, в какой директории lib поставить ваш JAR. Вы можете сделать это, выполнив следующее в своей консоли sbt: show unmanagedBase.

Если вы не видите свой проект там, вы можете запустить show YOURPROJECT/unmanagedBase, чтобы найти правильный путь lib.

Ответ 4

Добавьте эту строку в свой файл build.sbt и очистите и скомпилируйте свой проект.

project/libs, где проект является корневым каталогом вашего проекта, поместите свои jars в папку libs.

unmanagedBase <<= baseDirectory { base => base / "libs" }

Ответ 5

tl; dr Переместите project/build.sbt на один уровень вверх, где находится каталог lib, и используйте sbt-assembly плагин (как описано в другом ответе Алексея).

Если макет каталога проекта так же используется для вашего проекта, он неверен, поскольку build.sbt не принадлежит к той же сборке, где lib делает.

Так как sbt является рекурсивным, этот project/build.sbt описывает сборку проекта, которая управляет основной. Цитирование документы:

Каталог проекта - это еще один проект внутри вашего проекта, который знает, как построить свой проект. Проект внутри проекта может (в теория) делают все, что может сделать любой другой проект. Ваше определение сборки проект sbt.

И черепахи идут вниз. Если хотите, вы можете настроить построить определение проекта определения построения, создав каталог проекта/проекта/.

Ответ 6

Я ломал голову над резольверами и устанавливал ключевые переменные, но, похоже, это самый простой способ (https://www.scala-sbt.org/release/docs/Library-Dependencies.html):

resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

затем просто добавьте в libraryDependencies, как обычно,

libraryDependencies += "<group>" % "<artifact>" % "<version>"

Ответ 7

одно из решений заключается в том, что когда вы создаете эту банку в sbt, do sbt publish-local