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

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

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

Спасибо!

Ответ 1

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

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

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

  • Создайте файл repositories, в котором перечислены как ваш основной корпоративный репозиторий, так и любой дополнительный, который вы создали на шаге 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=<path-to-your-repo-file>
    

Хорошие новости для тех, кто использует более ранние версии sbt. Несмотря на то, что в стартовой бассете 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 := или того, что вы использовали для использования.

Ответ 2

ОК, с некоторой помощью от Марка Харры в списке рассылки sbt, у меня есть ответ, который работает.

Мой класс сборки теперь выглядит следующим образом (плюс некоторые другие репозитории):

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-адресом. Проблема решена!

Ответ 3

Все, что вам нужно, это определить файл свойств sbt.boot.properties, который позволит вам:

  • переопределить местоположение кэша плюща (мне нужно, потому что это было бы частью нашего роуминга профиля Windows, который сильно ограничен на диске в нашем магазине. См. Проблема 74)
  • определить любой другой репозиторий Maven, который вы хотите
    C:\HOMEWARE\apps\sbt-0.74\sbt.boot.properties

    [scala]
      version: 2.7.7
    #  classifiers: sources, javadoc

    [app]
      org: org.scala-tools.sbt
      name: sbt
      version: read(sbt.version)
      class: sbt.xMain
      components: xsbti
      cross-versioned: true
      classifiers: sources, javadoc

    [repositories]
      local
      my-nexus: http://my.nexus/nexus/content/repositories/scala-tools/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
      maven-local
    #  sbt-db: http://databinder.net/repo/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
    #  maven-central
    #  scala-tools-releases
    #  scala-tools-snapshots

    [boot]
     directory: project/boot
     properties: project/build.properties
     prompt-create: Project does not exist, create new project?
     prompt-fill: true
     quick-option: true

    [log]
     level: debug

    [app-properties]
     project.name: quick=set(test), new=prompt(Name)[p], fill=prompt(Name)
     project.organization: new=prompt(Organization)[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 version)[2.8.0.RC2], fill=prompt(Scala version)[2.8.0.RC2]
     sbt.version: quick=set(0.7.4), new=prompt(sbt version)[0.7.4], fill=prompt(sbt version)[0.7.4]
     project.scratch: quick=set(true)
     project.initialize: quick=set(true), new=set(true)

    [ivy]
     cache-directory: C:\HOMEWARE\projects\.ivy2\cache

Примечание: этот файл sbt.boot.properties вдохновлен:

Я прокомментировал любое внешнее определение хранилища Maven и добавил ссылку на мой собственный репозиторий Nexus Maven.

Пусковая установка может быть сконфигурирована одним из следующих способов в порядке возрастания приоритета:

  • Замените файл /sbt/sbt.boot.properties в jar.
  • Поместите файл конфигурации с именем sbt.boot.properties в путь к классам. Поместите его в корневой каталог пути без префикса /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 /C C:\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
  • ваш локальный репозиторий 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.

Ответ 4

Ну, это немного подтолкнуло меня, и я нашел парня, который написал плагин SBT для maven на github под названием maven-sbt поэтому все, что вам нужно сделать, это включить его в проект плагинов и сделать ваш проект mixin с maven.MavenDependencies и всеми вашими операциями, такими как обновление и публикация локальных работ с вашим локальным maven. Самое приятное в том, что, если вы похожи на меня, ваша организация - это все maven. Итак, все ваши библиотеки находятся в вашем локальном репозитории maven, но если по какой-то причине вы сначала строите sbt, тогда вы начинаете получать кучу или банки в плющом тоже. Какая пустая трата времени и времени, так как вам все равно нужно будет получить их для ваших сборщиков maven.

Тем не менее, я бы хотел, чтобы это было встроено в sbt, поэтому мне не нужно было добавлять его в каждый проект. Может быть, как процессор, по крайней мере. Он упомянул в одном, что я читал, что хотел бы добавить его к 0.9, но я не смог его найти.

Ответ 5

отредактируйте файл конфигурации в 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

Ответ 6

Я получил эту ошибку, потому что у меня был пустой файл в ~/.sbt/repositories. Как добавление репозиториев в файл, так и удаление файла решают проблему.