как мне заставить sbt использовать локальный репозиторий Maven Proxy (Nexus)? - PullRequest
72 голосов
/ 22 сентября 2010

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

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

Спасибо!

Ответы [ 6 ]

31 голосов
/ 05 апреля 2013

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

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

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

  2. Создайте файл 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]
    
  3. Либо сохраните этот файл в каталоге .sbt в вашем домашнем каталоге, либо укажите его в командной строке sbt:

    sbt -Dsbt.repository.config=<path-to-your-repo-file>
    

Хорошая новость для тех, кто использует более старые версии sbt : Несмотря на то, что, по крайней мере, в jar запуска sbt 0.12.0 файлы загрузочных свойств для более старых версий sbt не содержат обязательной строки ( тот, который упоминает repository.config), он все равно будет работать для тех версий sbt, если вы отредактируете эти файлы, добавив необходимую строку, и перепакуете их в jar запуска 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 := или того, что вы использовали.
12 голосов
/ 27 сентября 2010

ОК, с некоторой помощью Марка Харры из списка рассылки 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-адресом.Проблема решена!

9 голосов
/ 22 сентября 2010

Все, что вам нужно, это определить файл свойств 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 файл основан на:

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

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

  • Заменить файл /sbt/sbt.boot.properties в jar.
  • Поместите файл конфигурации с именем sbt.boot.properties в путь к классам.Поместите его в корневой каталог classpath без префикса /sbt.
  • Укажите расположение альтернативной конфигурации в командной строке.Это можно сделать следующим образом:
    • либо указав расположение в качестве системного свойства sbt.boot.properties
    • , либо в качестве первого аргумента для модуля запуска с префиксом '@'.

Системное свойство имеет более низкий приоритет.
Разрешение относительного пути:

  • первая попытка для текущего рабочего каталога,
  • затем по домашнему каталогу пользователя,
  • , а затем по каталогу, содержащему jar-файл запуска.

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


Определите оболочку 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 с открытым исходным кодом 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 я получаю (как и ОП)

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

BuЭто происходит только потому, что он уже загрузил 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.
6 голосов
/ 30 января 2015

редактировать файл конфигурации в 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
5 голосов
/ 07 мая 2011

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

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

0 голосов
/ 03 ноября 2017

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

...