как мне получить sbt для использования локального репозитория прокси-сервера maven (Nexus)?
У меня есть проект sbt (Scala), который в настоящее время вытаскивает артефакты из Интернета. Мы хотели бы перейти к корпоративному стандартизованному хранилищу Nexus, который будет кэшировать артефакты. Из документации Nexus я понимаю, как это сделать для проектов Maven. Но sbt, очевидно, использует другой подход. (Я понимаю, что Айви каким-то образом задействован, но я никогда не использовал его и не понимаю, как это работает.)
Как сообщить sbt и / или лежащему в основе Ivy использовать корпоративную систему репозитория Nexus для всех зависимостей? Я бы хотел, чтобы ответ использовал какой-то файл конфигурации на уровне проекта, так что новые клоны нашего исходного репозитория будут автоматически использовать прокси-сервер. (То есть, сбрасывание с конфигурационными файлами для каждого пользователя в dot-каталоге нецелесообразно.)
Благодаря!
- Добавить банки в Spark Job - spark-submit
- Для чего нужны classы типов в Scala?
- Используйте комбинатор парсера Scala для parsingа CSV-файлов
- Метод writeframe Spark для записи многих небольших файлов
- Действительные символы идентификатора в Scala
- Scala's '::', как это работает?
- Какова мотивация присвоения Scala для оценки Unit вместо присвоенного значения?
- Как обрабатывать многострочные записи ввода в Spark
- Какую библиотеку JSON использовать в Scala?
- Как вы определяете локальный var / val в основном конструкторе в Scala?
- Как распечатать содержимое RDD?
- Как выйти из цикла в Scala?
- Подписать CSR с помощью Bouncy Castle
Шаг 1: Следуйте инструкциям в разделе « Подробные темы: репозитории прокси» , которые я обобщил и добавил ниже:
-
(Если вы используете Artifactory, вы можете пропустить этот шаг.) Создайте полностью отдельный repository (или группу) Maven proxy в корпоративном репозитории Maven, в репозитории прокси -типа с плющом, такие как эти два важных:
- http://repo.typesafe.com/typesafe/ivy-releases/
- http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/
Это необходимо, потому что некоторые менеджеры репозитория не могут обрабатывать репозитории типа Ivy и Maven, смешанные вместе.
-
Создайте
repositories
файлов, в которых перечислены как ваш основной корпоративный repository, так и любой дополнительный, который вы создали на шаге 1, в формате, показанном ниже:[repositories] my-maven-proxy-releases: http://repo.example.com/maven-releases/ my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
-
Сохраните этот файл в каталоге
.sbt
внутри вашего домашнего каталога или укажите его в командной строке sbt:sbt -Dsbt.repository.config=
Хорошие новости для тех, кто использует устаревшие версии sbt : хотя, по крайней мере, в jb-файле sbt 0.12.0, файлы свойств загрузки для более старых версий sbt не содержат требуемую строку (та, которая упоминает файл repository.config
), это будут по-прежнему работать для этих версий sbt, если вы отредактируете эти файлы, чтобы добавить нужную строку, и переупаковывайте их в банку запуска sbt 0.12.0! Это связано с тем, что эта функция реализована в панели запуска, а не в самом sbt. И, как утверждается, стартер sbt 0.12.0 может запускать все версии sbt, вплоть до 0.7!
Шаг 2. Чтобы убедиться, что внешние репозитории не используются, удалите репозитории по умолчанию из ваших решений. Это можно сделать одним из двух способов:
- Добавьте параметр командной строки
-Dsbt.override.build.repos=true
указанный на странице Подробные темы выше. Это приведет к тому, что репозитории, указанные вами в файле, будут переопределять любые репозитории, указанные в любом из ваших файлов sbt. Это может работать только в sbt 0.12 и выше, хотя я еще не пробовал. - Используйте
fullResolvers := Seq(
resolver (s) для ваших корпоративных хранилищ maven)
в ваших файлах сборки вместоresolvers ++=
илиresolvers :=
или что вы использовали для использования.
Хорошо, с некоторой помощью от Марка Харры в списке рассылки sbt, у меня есть ответ, который работает.
Мой class сборки теперь выглядит следующим образом (плюс некоторые другие репозитории):
import sbt._ //By extending DefaultWebProject, we get Jetty support class OurApplication(info: ProjectInfo) extends DefaultWebProject(info) { // This skips adding the default repositories and only uses the ones you added // explicitly. --Mark Harrah override def repositories = Set("OurNexus" at "http://our.nexus.server:9001/nexus/content/groups/public/") override def ivyRepositories = Seq(Resolver.defaultLocal(None)) ++ repositories /* Squeryl */ val squeryl = "org.squeryl" % "squeryl_2.8.0.RC3" % "0.9.4beta5" /* DATE4J */ val date4j = "hirondelle.date4j" % "date4j" % "1.0" from "http://www.date4j.net/date4j.jar" // etc }
Теперь, если я удалю дерево Squeryl из .ivy2/cache
моего компьютера, sbt пытается захватить его из дерева Nexus с соответствующим URL-адресом. Задача решена!
Все, что вам нужно, это определить файл sbt.boot.properties
который позволит вам:
- переопределите расположение кэша плюща (мне это нужно, потому что это было бы частью нашего роумингового профиля Windows , который сильно ограничен на диске в нашем магазине. См. выпуск 74 )
- определить любой другой repository Maven, который вы хотите
C: \ \ Apps ТОВАРЫ ДЛЯ ДОМА \ SBT-0,74 \ sbt.boot.properties [Scala] версия: 2.7.7 # classификаторы: источники, javadoc [приложение] org: org.scala-tools.sbt имя: sbt версия: read (sbt.version) class: sbt.xMain компоненты: xsbti cross-versioned: true classификаторы: источники, javadoc [Хранилища] местный my-nexus: http://my.nexus/nexus/content/repositories/scala-tools/, [организация] / [module] / [revision] / [type] s / [артефакт] (- [classификатор]). [доб] Maven-местный # sbt-db: http://databinder.net/repo/, [организация] / [module] / [revision] / [type] s / [артефакт] (- [classификатор]). [ext] # maven-central # scala-tools-релизы # scala-tools-snapshots [Загрузки] directory: project / boot свойства: project / build.properties prompt-create: Project не существует, создайте новый проект? prompt-fill: true quick-option: true [журнал] Уровень: отладка [Приложение-свойство] project.name: quick = set (test), new = prompt (Name) [p], fill = prompt (Name) project.organization: new = prompt (Организация) [org.vonc] project.version: quick = set (1.0), new = prompt (Version) [1.0], fill = prompt (Version) [1.0] build.scala.versions: quick = set (2.8.0.RC2), new = prompt (версия Scala) [2.8.0.RC2], fill = prompt (версия Scala) [2.8.0.RC2] sbt.version: quick = set (0.7.4), new = prompt (версия sbt) [0.7.4], fill = prompt (версия sbt) [0.7.4] project.scratch: quick = set (true) project.initialize: quick = set (true), new = set (true) [Плющ] cache-directory: C: \ HOMEWARE \ projects \ .ivy2 \ cache
Примечание: этот файл sbt.boot.properties
вдохновлен:
- который упоминается на странице «Обобщенный запуск» проекта sbt .
- тот, который найден внутри самого
sbt-0.74
!
Я прокомментировал любое внешнее определение хранилища Maven и добавил ссылку на мой собственный repository Nexus Maven.
Пусковая установка может быть сконфигурирована одним из следующих способов в порядке возрастания приоритета:
- Замените файл
/sbt/sbt.boot.properties
вjar
.- Поместите файл конфигурации с именем
sbt.boot.properties
к classам. Поместите его в корневой/sbt
префикса/sbt
.- Укажите расположение альтернативной конфигурации в командной строке. Это можно сделать:
- либо указать местоположение как системное свойство
sbt.boot.properties
- или как первый аргумент для запуска с префиксом ‘
@
‘.Системное свойство имеет более низкий приоритет.
Разрешение относительного пути:
- первая попытка против текущего рабочего каталога,
- затем в домашнем каталоге пользователя,
- а затем против каталога, содержащего банку запуска.
Ошибка возникает, если ни одна из этих попыток не выполнена.
Определите оболочку sbt.bat (чтобы не указывать ваши sbt.boot.properties
), например:
C:\HOMEWARE>more C:\HOMEWARE\bin\sbt.BAT @echo off set t=%~dp0 set adp0=%t:C:\="%" set SBT_DIR=%adp0%..\apps\sbt-0.74 dir C:\%SBT_DIR%\sbt-launch-0.7.4.jar # if needed, add your proxy settings set PROXY_OPTIONS=-Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=80xx -Dhttp.proxyUser=auser -Dhttp.proxyPassword=yyyy set JAVA_OPTIONS=-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -cp C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4 set SBT_BOOT_PROPERTIES=-Dsbt.boot.properties="sbt.boot.properties" cmd /CC:\HOMEWARE\apps\jdk4eclipse\bin\java.exe %PROXY_OPTIONS% %JAVA_OPTIONS% %SBT_BOOT_PROPERTIES% -jar C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4.jar %*
И ваш sbt будет скачивать артефакты только из:
- ваш Nexus
- ваш местный repository Maven.
Просто протестирован дома со старым Nexus opensource 1.6 У меня был бег, java 1.6, sbt07.4
C:\Prog\Java\jdk1.6.0_18\jre\bin\java -Xmx512M -Dsbt.boot.properties=sbt.boot.properties - jar "c:\Prog\Scala\sbt\sbt-launch-0.7.4.jar"
Это дает:
[success] Build completed successfully. C:\Prog\Scala\tests\pp>sbt Getting Scala 2.8.0 ... downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.8.0/scala-compiler-2. 8.0.jar ... [SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.0!scala-compiler.jar (311ms) downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-library/2.8.0/scala-library-2.8. 0.jar ... [SUCCESSFUL ] org.scala-lang#scala-library;2.8.0!scala-library.jar (185ms) :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 2 artifacts copied, 0 already retrieved (14484kB/167ms) [info] Building project test 0.1 against Scala 2.8.0 [info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
Если я попробую смешное значение в файле sbt.boot.properties:
C:\Prog\Scala\tests\pp>sbt Getting Scala 2.9.7 ... :: problems summary :: :::: WARNINGS module not found: org.scala-lang#scala-compiler;2.9.7 ==== nexus: tried http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.pom -- artifact org.scala-lang#scala-compiler;2.9.7!scala-compiler.jar: http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.jar
Таким образом, он ограничивается двумя репо, которые я определил:
[repositories] nexus: http://localhost:8081/nexus/content/repositories/scala nexus2: http://localhost:8081/nexus/content/repositories/scala, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
(Я прокомментировал все остальное: local
, maven-local
, …)
Если я прокомментирую все репозитории и поместил смешное значение (2.7.9) для версии scala в sbt.boot.properties
, я получаю (как и OP)
C:\Prog\Scala\tests\pp>sbt Error during sbt execution: No repositories defined.
Если я поставлю 2.7.7 (пока все комментарии репо не будут учтены), да, это не приведет к ошибке:
C:\Prog\Scala\tests\pp>sbt [info] Building project test 0.1 against Scala 2.8.0 [info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
Но это только потому, что он уже загрузил scala2.8.0 во время моих предыдущих попыток.
Если я удалю эту библиотеку из моего каталога project/boot
, то она выкинет исключение:
[info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7 > C:\Prog\Scala\tests\pp>sbt Error during sbt execution: No repositories defined. at xsbt.boot.Pre$.error(Pre.scala:18) at xsbt.boot.Update.addResolvers(Update.scala:197) ... at xsbt.boot.Boot$.main(Boot.scala:15) at xsbt.boot.Boot.main(Boot.scala) Error loading project: Error during sbt execution: No repositories defined.
Ну, это немного раздражало меня, поэтому я нашел парня, который написал плагин SBT для maven на github, называемый maven-sbt, поэтому все, что вам нужно сделать, это включить его в проект плагинов и сделать ваш проект mixin с maven.MavenDependencies и все ваши операции, такие как обновление и публикация-локальная работа с вашим локальным maven. Самое приятное в том, что, если вы похожи на меня, ваша организация – это все maven. Итак, все ваши библиотеки находятся в вашем локальном репозитории maven, но если по какой-то причине вы сначала строите sbt, тогда вы начинаете получать кучу или банки в плющом тоже. Какая пустая трата времени и времени, так как вам все равно нужно будет достать их для ваших построек maven.
Тем не менее, я бы хотел, чтобы это было встроено в sbt, поэтому мне не нужно было добавлять его в каждый проект. Может быть, как процессор, по крайней мере. Он упомянул в одном, что я читал, что хотел бы добавить его к 0.9, но я не смог его найти.
отредактируйте файл конфигурации в sbt_home / conf “sbtconfig.txt”
добавить две строки
-Dsbt.override.build.repos=true -Dsbt.repository.config="C:/Program Files (x86)/sbt/conf/repo.properties"
Содержимое repo.properties
[repositories] local public: http://222.vvfox.com/public <-fix this ,write your local nexus group url
Я получил эту ошибку, потому что у меня был пустой файл в ~/.sbt/repositories
. Как добавление репозиториев в файл, так и удаление файла решили проблему.