Как заставить Maven использовать правильные репозитории?

Я только что проверил некоторые проекты, и мне нужно их построить, однако я установил Maven довольно давно (может быть, 6 месяцев?) И с тех пор действительно не использовал его - pom.xml для проекта, который у меня есть, не имеет этого "http://repo1.maven.org/myurlhere" в любом месте - он имеет абсолютное url, где Репозиторий Maven предназначен для проекта, но Maven все еще пытается загрузить из общего репозитория Maven:

Macintosh:trunk$ mvn clean install
[INFO] Scanning for projects...
Downloading: http://repo1.maven.org/url/project/project/x.x/project-x.x.pom
[INFO] Unable to find resource 'url.project:project:pom:x.x' in repository central (http://repo1.maven.org/)
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

GroupId: url.project
ArtifactId: project
Version: x.x

Reason: Unable to download the artifact from any repository

  url.project:project:pom:x.x

from the specified remote repositories:
  central (http://repo1.maven.org/)

Может ли кто-нибудь помочь мне с тем, что я делаю неправильно?
По сути, я только что проверил проекты из командной строки, cd-ed в каталог и запустил mvn clean install - больше ничего.
Любая помощь очень важна. оценил.


person user284163    schedule 02.03.2010    source источник


Ответы (5)


pom.xml для проекта, который у меня есть, не имеет этого "http://repo1.maven.org/myurlhere" в любом месте

Все проекты имеют http://repo1.maven.org/, объявленные как <repository> ( и <pluginRepository>) по умолчанию. Этот репозиторий, который называется центральным репозиторием, наследуется, как и другие настройки по умолчанию, от «Super POM» (все проекты наследуются от Super POM). Таким образом, POM на самом деле представляет собой комбинацию Super POM, любых родительских POM и текущего POM. Эта комбинация называется «эффективным POM» и может быть напечатана с помощью цели effective-pom плагина справки Maven (полезно для отладки).

И действительно, если вы запустите:

mvn help:effective-pom

Вы увидите как минимум следующее:

  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>

у него есть абсолютный URL-адрес, где находится репозиторий maven для проекта, но maven все еще пытается загрузить из общего репозитория maven.

Maven попытается найти зависимости во всех объявленных репозиториях, в том числе в центральном, который, как мы видели, присутствует по умолчанию. Но, согласно трассировке, которую вы показываете, у вас определен только один репозиторий (центральный репозиторий), иначе maven напечатает что-то вроде этого:

Reason: Unable to download the artifact from any repository

  url.project:project:pom:x.x

from the specified remote repositories:
  central (http://repo1.maven.org/),
  another-repository (http://another/repository)

Итак, в основном, maven не может найти url.project:project:pom:x.x, потому что он недоступен в центре.

Но не зная, какой проект вы проверили (возможно, в нем есть конкретные инструкции) или какая зависимость отсутствует (ее можно найти в другом репозитории), невозможно помочь вам в дальнейшем.

person Pascal Thivent    schedule 02.03.2010
comment
чтобы точно увидеть, где он проверяет во время работы, запустите mvn -U dependency:resolve - -U заставляет mvn повторить попытку, иначе он кэширует ошибку как метаданные - person Adam; 16.02.2017
comment
Вы спасатель жизни! - person hey_you; 10.01.2019
comment
Спасибо! Этот ответ только что помог мне! Ключом был pluginRepository (в дополнение к repository), потому что ссылка на плагин из «того» (стороннего) репозитория. - person Sergey Vyacheslavovich Brunov; 04.05.2020

По умолчанию Maven всегда будет искать в официальном репозитории Maven, который находится по адресу http://repo1.maven.org.

Когда Maven пытается построить проект, он будет искать в вашем локальном репозитории (по умолчанию ~/.m2/repository, но вы можете настроить его, изменив значение <localRepository> в вашем ~/.m2/settings.xml), чтобы найти любую зависимость, плагин или отчет, определенные в вашем pom.xml. Если соответствующий артефакт не найден в вашем локальном репозитории, он будет искать во всех настроенных внешних репозиториях, начиная с репозитория по умолчанию, http://repo1.maven.org.

Вы можете настроить Maven, чтобы избежать этого репозитория по умолчанию, установив зеркало в файле settings.xml:

<mirrors>
    <mirror>
        <id>repoMirror</id>
        <name>Our mirror for Maven repository</name>
        <url>http://the/server/</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>

Таким образом, вместо того, чтобы связываться с http://repo1.maven.org, Maven свяжется с вашим корпоративным репозиторием (в данном примере http://the/server).

Если вы хотите добавить еще один репозиторий, вы можете определить новый в файле settings.xml:

<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <repositories>
            <repository>
                <id>foo.bar</id>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
                <url>http://new/repository/server</url>
            </repository>
        </repositories>

Полную модель settings.xml можно увидеть здесь.

Что касается процесса clean, вы можете попросить Maven запустить его автономно. В этом случае Maven не будет пытаться получить доступ к каким-либо внешним репозиториям:

mvn -o clean 
person Romain Linsolas    schedule 02.03.2010
comment
Maven не разрешает зависимости во время очистки, нет необходимости запускать его в автономном режиме (по крайней мере, не с maven 2.2.1 и чистым плагином 2.2). - person Pascal Thivent; 02.03.2010
comment
НИКОГДА не используйте подстановочный знак * при определении зеркал, иначе вы не сможете создавать инструменты сторонних поставщиков или примеры проектов, которые определяют пользовательские репозитории в своих pom. - person HDave; 04.05.2016
comment
Что эквивалентно определению и переопределению этого в моем файле проекта pom.xml? - person powder366; 25.02.2017
comment
Почему «зеркало» перезаписывает центральный репозиторий? - person zygimantus; 04.07.2017
comment
Это отличная информация. Но является ли центральный репозиторий maven repo1.maven.org, как вы указали выше, или repo.maven.apache.org/maven2, как показано на maven.apache.org/pom.html#Repositories? - person J Woodchuck; 30.12.2018

тл;др

Все POM maven наследуются от базы Super POM.
Фрагмент ниже является частью Super POM для Maven 3.5.4.

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
person bence of outer space    schedule 09.10.2019

Я думаю, что вы пропустили вот это:

https://maven.apache.org/settings.html#Servers

Репозитории для загрузки и развертывания определяются репозиториями и элементами DistributionManagement POM. Однако некоторые параметры, такие как имя пользователя и пароль, не следует распространять вместе с файлом pom.xml. Этот тип информации должен существовать на сервере сборки в файле settings.xml.

Это предпочтительный способ использования пользовательских репозиториев. Так что, вероятно, происходит то, что URL-адрес этого репо находится в settings.xml сервера сборки.

Как только вы получите URL-адрес и учетные данные, вы можете поместить их на свой компьютер здесь: ~/.m2/settings.xml вот так:

<settings ...> 

        .
        .
        .
        <servers>
            <server>
              <id>internal-repository-group</id>
              <username>YOUR-USERNAME-HERE</username>
              <password>YOUR-PASSWORD-HERE</password>
            </server>
        </servers>
</settings>

ИЗМЕНИТЬ:

Затем вам нужно сослаться на этот репозиторий в проект POM. Идентификатор internal-repository-group можно использовать в каждом проекте. Вы можете настроить несколько репозиториев и учетных данных, используя разные идентификаторы в настройках xml.

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

Ниже приведен пример pom проекта с использованием группы внутренних репозиториев.

<repositories>
    <repository>
        <id>internal-repository-group</id>
        <name>repo-name</name>
        <url>http://project.com/yourrepourl/</url>
        <layout>default</layout>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </snapshots>
    </repository>
</repositories>
person shabby    schedule 22.10.2018

По сути, все, что Maven говорит вам, это то, что определенные зависимости в вашем проекте недоступны в центральном репозитории maven. По умолчанию нужно искать в вашей локальной папке .m2 (локальный репозиторий), а затем во всех настроенных репозиториях в вашем POM, а затем в центральном репозитории maven. Посмотрите раздел репозиториев справочника по Maven.

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

person Taylor Leese    schedule 02.03.2010