Maven - развернуть зависимости в удаленном хранилище - PullRequest
13 голосов
/ 12 января 2012

У меня есть несколько проектов с множеством зависимостей maven. Когда я вызываю команду mvn deploy (или какой-то ее вариант), я хотел бы, чтобы сам проект был развернут не только в удаленном репозитории, но и все его зависимости. Это возможно? Я вижу много «похожих вопросов» на этом сайте, но я не могу найти ничего, что так просто сформулировать. Все остальное, что я видел, похоже, ожидает некоторой дополнительной функциональности. Я просто хочу развернуть свой проект, а также все его зависимости в удаленном репо. Я использую плагин компилятора maven 1.5

Это фрагмент моего файла settings.xml. Есть идеи, что мне не хватает?

<mirrors>
<mirror>
  <!--This is used to direct the public snapshots repo in the 
      profile below over to a different nexus group -->
  <id>nexus-public-snapshots</id>
  <mirrorOf>public-snapshots</mirrorOf>
  <url>http://{ourServer}/nexus/content/groups/public-snapshots</url>
</mirror>
<mirror>
  <!--This sends everything else to /public -->
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://{ourServer}/nexus/content/groups/public</url>
</mirror>
  </mirrors>
<profiles>
<profile>
  <id>development</id>
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>
<profile>
  <!--this profile will allow snapshots to be searched when activated-->
  <id>public-snapshots</id>
  <repositories>
    <repository>
      <id>public-snapshots</id>
      <url>http://public-snapshots</url>
      <releases><enabled>false</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>public-snapshots</id>
      <url>http://public-snapshots</url>
      <releases><enabled>false</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>
 </profiles>

Заранее спасибо
~ J

Ответы [ 3 ]

8 голосов
/ 04 сентября 2014

Я предлагаю следующее решение, которое гораздо меньше похоже на метод проб и ошибок для разрешения зависимостей по сравнению с существующими ответами.

Что вы можете сделать, это позвонить mvn -Dmdep.copyPom=true dependency:copy-dependencies после развертывания основного проекта. Это позволит транзитивно скопировать все зависимости вашего проекта в target/dependency, включая их соответствующие файлы pom.

Затем вы можете выполнить итерацию по всем зависимостям и развернуть их в хранилище, используя deploy:deploy-file, например, с такой петлей bash:

for pom in target/dependency/*.pom; do mvn deploy:deploy-file -Durl=http://your/repo -Dfile="${pom%%.pom}.jar" -DgeneratePom=false -DpomFile="$pom"
3 голосов
/ 25 февраля 2012

Вот как это работает в двух словах, при условии, что ваш удаленный репозиторий (Nexus, или Artifactory, или тому подобное) и settings.xml настроены правильно.

Допустим, у вас есть проект с одной зависимостью от commons-logging. Когда Maven разрешает зависимости вашего проекта как часть сборки, он выполняет следующие шаги:

  1. Проверяет локальное репо на commons-logging.
  2. Если найдено, сделано. Продолжить сборку.
  3. Если не найден: проверяет наличие commons-logging в удаленном репо.
  4. Если найдено, загрузите артефакт в локальный репозиторий. Готово; продолжить сборку.
  5. Если не найдено в удаленном репо: удаленное репо связывается с центральным офисом для загрузки commons-logging. Затем Maven можно загрузить в локальный репозиторий. Готово; продолжить сборку.

В конце этих шагов, commons-logging должно быть как в вашем локальном, так и в удаленном репозитории, больше ничего не нужно делать. Если это не так, то либо ваш settings.xml не настроен для подключения к удаленному репо при поиске зависимостей (он напрямую связывается с центральным сервером?), Либо Nexus настроен неправильно.

---- Редактировать ----

Вот фрагмент моего файла settings.xml, который работает. @Raghuram дал вам хороший совет, когда он предложил вам включить оба профиля; если бы вы каким-то образом включили только профиль public-snapshots, ваши сборки продолжали бы попадать непосредственно в maven central.

....
<mirrors>
    <!-- redirects all traffic to internal Nexus repo instead of Maven central -->
    <mirror>
        <id>maven2</id>
        <mirrorOf>*</mirrorOf>
        <url>http://repository.someCompany.com/maven2RepoOrGroupInNexus</url>
    </mirror>
</mirrors>
....
<profiles>
    <profile>
        <id>repo-profile</id>
        <repositories>
            <repository>
                <id>central</id>
                <url>http://gotoNexus</url>  <!-- URL is unimportant here -->
                <snapshots>
                    <enabled>true</enabled>
                    <updatePolicy>daily</updatePolicy>
                </snapshots>
                <releases>
                    <enabled>true</enabled>
                    <updatePolicy>daily</updatePolicy>
                </releases>
            </repository>
        </repositories>
    </profile>
</profiles>
<activeProfiles>
    <activeProfile>repo-profile</activeProfile>  <!-- important -->
</activeProfiles>

Обратите внимание на элемент activeProfiles внизу; это означает, что вы будете использовать Nexus вместо Maven central с каждой командой mvn.

Вам все еще нужно убедиться, что Nexus настроен так, чтобы URL, определенный в <mirror>, содержал контент из Maven central, но как настроить Nexus, было бы отдельным вопросом.

Ссылка: Документация Nexus для конфигурации Maven

2 голосов
/ 13 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...