Как публиковать банку в локальном репозитории?
У меня есть библиотека, скомпилированная в jar (не проект sbt, не исходный код, только файл jar), который недоступен в репозитории.
Есть ли способ опубликовать jar локально, поэтому я могу добавить зависимость, используя нотацию libraryDependencies += "org.xxx" % "xxx" % "1.0"
? (Я уже знаю, как добавить файл в проект, скопировав его в папку lib
.)
Ответы
Ответ 1
Действие ** publishLocal ** используется для публикации вашего проекта в локальном репозитории Ivy. По умолчанию этот локальный репозиторий находится в $ {user.home}/. Ivy2/local. Затем вы можете использовать этот проект из других проектов на том же компьютере источника
РЕДАКТИРОВАТЬ: Извините, я неправильно понял ваш вопрос. Вот пример, чтобы опубликовать jar или исходники в вашем локальном репозитории ivy.
Ответ 2
tl; dr Я бы назвал это трюк, а не особенностью sbt. Вы были предупреждены.
Скажем, у вас есть file.jar
для публикации. Как и для любого инструмента построения, включая sbt, он выполняет задачи, которые в конечном итоге создают артефакт - файл jar в большинстве случаев - из файлов в проекте.
Проект устанавливает координаты для артефакта.
Хитрость заключается в том, чтобы использовать то, что sbt требует, чтобы настроить среду (= координаты) для публикации jar (в противном случае вам нужно будет указать их в командной строке, которая может или не может быть очень удобной для пользователя).
Создайте build.sbt
с необходимыми настройками - organization
, name
, version
и, возможно, scalaVersion
- и сохраните его там, где находится файл jar.
organization := "org.abc"
name := "my-own-publish-jar"
version := "1.0.0"
scalaVersion := "2.11.3"
packageBin in Compile := file(s"${name.value}_${scalaBinaryVersion.value}.jar")
Возможно, вы заметили, что сборка изменяет задачу compile:package
, чтобы указать на файл jar.
Что это.
Выполнить sbt publishLocal
, а файл jar должен находиться в локальном репозитории Ivy2, т.е. ~/.ivy2/local/org.abc/my-own-publish-jar_2.11/1.0.0/jars/my-own-publish-jar_2.11.jar
.
protip Написание плагина для этого с координатами, указанными в командной строке, должно быть довольно простым.
Ответ 3
Предположим, что у вас есть wetElephant.jar
и wetElephant-javadoc.jar
файлы сторонней библиотеки и соответствующие javadocs, которые вы хотите опубликовать в своем локальном репо, и ссылайтесь на него из другого проекта с помощью libraryDependencies
sbt taskKey.
Вот что вам нужно сделать.
- Поместите ваши библиотеки (
wetElephant.jar
и wetElephant-javadoc.jar
) в modules\wetElephant
-
Определите проект в файле build.sbt(или файле Build.scala)
lazy val stolenLib = project
.in(file("modules/wetElephant"))
.settings(
organization := "com.stolenLibs",
name := "wetElephant",
version := "0.1-IDonKnow",
crossPaths := false, //don't add scala version to this artifacts in repo
publishMavenStyle := true,
autoScalaLibrary := false, //don't attach scala libs as dependencies
description := "project for publishing dependency to maven repo, use 'sbt publishLocal' to install it",
packageBin in Compile := baseDirectory.value / s"${name.value}.jar",
packageDoc in Compile := baseDirectory.value / s"${name.value}-javadoc.jar"
)
-
Вызов publishLocal
задачи из sbt/activator (я сделал это из активатора и префикс его с именем proejct):
./activator wetElephant/publishLocal
... и прочитайте вывод, чтобы узнать, что и где было опубликовано:
/cygdrive/d/devstation-workspace/projects/m4l-patches 1
[info] Loading project definition from D:\devstation-workspace\projects\m4l-patches\project
[info] Set current project to m4l-patches (in build file:/D:/devstation-workspace/projects/m4l-patches/)
[info] Updating {file:/D:/devstation-workspace/projects/m4l-patches/}wetElephant...
[info] Packaging D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow-sources.jar ...
[info] Done packaging.
[info] Wrote D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow.pom
[info] Resolving org.fusesource.jansi#jansi;1.4 ...4 ....
[info] Done updating.
[info] :: delivering :: com.stolenLibs#wetelephant;0.1-IDonKnow :: 0.1-IDonKnow :: release :: Sun Dec 20 20:09:24 CET 2015
[info] delivering ivy file to D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\ivy-0.1-IDonKnow.xml
[info] published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\poms\wetelephant.pom
[info] published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\jars\wetelephant.jar
[info] published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\srcs\wetelephant-sources.jar
[info] published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\docs\wetelephant-javadoc.jar
[info] published ivy to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\ivys\ivy.xml
[success] Total time: 1 s, completed 2015-12-20 20:09:24
-
Опционально используйте эти библиотеки в другом проекте
libraryDependencies += "com.stolenLibs" % "wetElephant" % "0.1-IDontKnow"
Отказ от ответственности: я не знаю, как не публиковать источники...
Ответ 4
Вот сообщение в блоге, которое я последовал, чтобы вытащить артефакт sbt в репозиторий maven (локальный и удаленный) несколько месяцев назад.
http://brizzled.clapper.org/id/100/
Ответ 5
Попробуйте следующее:
http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
Ответ 6
Я создал пример проекта Play Framework/sbt, который создает локальный репозиторий (а не только publish-local
) здесь: https://github.com/muymoo/local-ivy-repo-sbt
В частности, посмотрите Build.scala
makeLocalRepoSettings(publishedProjects):_*
и
localRepoArtifacts += "org.apache.ws.security" % "wss4j" % "1.6.9"
Эти localRepoArtifacts
находятся в моем локальном репозитории плюща, но я думаю, вы могли бы отредактировать это, чтобы работать с обычными старыми файлами jar.
Для запуска: play local-repository-created
Это более простая версия https://github.com/sbt/sbt-remote-control, которая делает намного больше в Build.scala
.