как мне получить sbt для использования локального репозитория прокси-сервера maven (Nexus)?

У меня есть проект sbt (Scala), который в настоящее время вытаскивает артефакты из Интернета. Мы хотели бы перейти к корпоративному стандартизованному хранилищу Nexus, который будет кэшировать артефакты. Из документации Nexus я понимаю, как это сделать для проектов Maven. Но sbt, очевидно, использует другой подход. (Я понимаю, что Айви каким-то образом задействован, но я никогда не использовал его и не понимаю, как это работает.)

Как сообщить sbt и / или лежащему в основе Ivy использовать корпоративную систему репозитория Nexus для всех зависимостей? Я бы хотел, чтобы ответ использовал какой-то файл конфигурации на уровне проекта, так что новые клоны нашего исходного репозитория будут автоматически использовать прокси-сервер. (То есть, сбрасывание с конфигурационными файлами для каждого пользователя в dot-каталоге нецелесообразно.)

Благодаря!

Шаг 1: Следуйте инструкциям в разделе « Подробные темы: репозитории прокси» , которые я обобщил и добавил ниже:

  1. (Если вы используете Artifactory, вы можете пропустить этот шаг.) Создайте полностью отдельный repository (или группу) Maven proxy в корпоративном репозитории Maven, в репозитории прокси -типа с плющом, такие как эти два важных:

    Это необходимо, потому что некоторые менеджеры репозитория не могут обрабатывать репозитории типа Ivy и Maven, смешанные вместе.

  2. Создайте 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] 
  3. Сохраните этот файл в каталоге .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. Чтобы убедиться, что внешние репозитории не используются, удалите репозитории по умолчанию из ваших решений. Это можно сделать одним из двух способов:

  1. Добавьте параметр командной строки -Dsbt.override.build.repos=true указанный на странице Подробные темы выше. Это приведет к тому, что репозитории, указанные вами в файле, будут переопределять любые репозитории, указанные в любом из ваших файлов sbt. Это может работать только в sbt 0.12 и выше, хотя я еще не пробовал.
  2. Используйте 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 . Как добавление репозиториев в файл, так и удаление файла решили проблему.

  • Многострочный литерал функции в качестве аргументов в Scala
  • Получение десугатной части выражения Scala для / понимания?
  • Печать массива в Scala
  • Как развернуть Spark DataFrame?
  • Что такое более высокий тип в Scala?
  • "Eval" в Scala
  • Почему `private val` и` private final val` отличаются?
  • Каковы некоторые убедительные варианты использования зависимых типов методов?
  • В чем разница между JavaConverters и JavaConversions в Scala?
  • Scala: абстрактные типы против дженериков
  • Какие веб-frameworks Scala доступны?
  • Interesting Posts

    Программно получить уровень API Android на устройстве?

    Что такое RPC-инфраструктура и Apache Thrift?

    Извлечь диапазон outlookирования из lme fit

    «StartTag: недопустимое имя элемента» в default.aspx

    Проблема с генераторами Java: ошибка classа «не в пределах ограничений типа».

    Как удалить строку по ссылке в data.table?

    Что означают термины «асинхронный» и «синхронный» в отношении определения прерывания?

    Самый быстрый способ итерации массива в Java: переменная цикла vs увеличена для оператора

    В Windows (и ПК), какой инструмент восстановления разделов является хорошим, надежным?

    Разница между wait () и sleep ()

    Клиент Cisco VPN – внешний URL-адрес отслеживается?

    Где хранятся файлы физического шрифта?

    Ошибка “элемент инициализации не является константой” при попытке инициализировать переменную с константой

    Угловые динамические вкладки с выбранными компонентами

    Реверсирование анимации

    Давайте будем гением компьютера.