Maven-развертывание зависимостей в удаленном репозитории

У меня есть несколько проектов с большим количеством зависимостей Maven. Когда я вызываю команду mvn deploy (или некоторую ее вариацию), я хотел бы не только развернуть сам проект в удаленном репозитории, но и все его зависимости. Возможно ли это? Я вижу много "подобных вопросов" на этом сайте, но я не могу найти ничего, что так просто сказано. Все остальное, что я видел, похоже, ожидает некоторой дополнительной функциональности. Я просто хочу развернуть свой проект, плюс все его зависимости от удаленного РЕПО. Я использую плагин компилятора maven 1.5

Это фрагмент моих настроек.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>

спасибо заранее
~Джей

3 ответов


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

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

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


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

что вы можете сделать, это позвонить 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"

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

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

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

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

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

вот фрагмент моих настроек.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 с каждым .

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

ссылки: Nexus docs для конфигурации Maven