如何使Maven使用正确的存储库?


69

我刚刚签出了一些项目并需要构建它们,但是我很早以前就安装了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到目录中并运行了mvn clean install
任何帮助是极大的赞赏。

Answers:


73

我拥有的项目的pom.xml在其中的任何地方都没有此“ http://repo1.maven.org/myurlhere

默认情况下,所有项目的http://repo1.maven.org/都声明为<repository>(和<pluginRepository>)。与其他默认设置一样,此存储库(称为中央存储库)是从“ Super POM”继承的(所有项目均从Super POM继承)。因此,POM实际上是超级POM,任何父POM和当前POM的组合。这种组合称为“有效POM”,可以使用effective-pomMaven帮助插件的目标进行打印(可用于调试)。

实际上,如果您运行:

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>

它具有该项目的Maven回购所在的绝对URL,但是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它,因为它在Central中不可用。

但是,如果不知道您检出了哪个项目(可能有特定的说明)或缺少哪个依赖项(可以在另一个存储库中找到它),就无法进一步帮助您。


要查看它在运行时检查的确切位置,请运行mvn -U dependency:resolve --U强制mvn重试,否则将故障作为元数据缓存
亚当

您是救生员!
hey_you

谢谢!这个答案对我有帮助!pluginRepository是的关键(除了repository),因为引用了«that»(第三方)存储库中的插件。
谢尔盖·布鲁诺夫

31

默认情况下,Maven将始终在官方Maven存储库中查找,该存储库为http://repo1.maven.org

当Maven尝试构建项目时,它将在您的本地存储库中查找(默认情况下,~/.m2/repository但您可以通过更改的<localRepository>值来配置它~/.m2/settings.xml)以查找在中定义的任何依赖项,插件或报告pom.xml。如果在本地存储库中找不到足够的工件,则它将在配置的所有外部存储库中查找,从默认存储库http://repo1.maven.org开始

您可以通过在settings.xml文件中设置镜像来配置Maven以避免此默认存储库:

<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 

1
Maven不会在清理过程中解决依赖关系,不需要脱机运行(至少不是在使用maven 2.2.1和清理插件2.2的情况下)。
Pascal Thivent

5
定义镜像时,切勿使用通配符“ *”表达,否则您将无法构建第三方供应商工具或在pom中定义自定义存储库的示例项目。
HDave

在我的项目pom.xml文件中定义和覆盖它等效于什么?
powder366 '17

为什么<mirror>覆盖中央存储库?
zygimantus

这是很棒的信息。但中央Maven仓库repo1.maven.org你状态高于或repo.maven.apache.org/maven2显示在,如maven.apache.org/pom.html#Repositories
J土拨鼠'18

4

基本上,所有Maven都告诉您,中央maven存储库中不存在项目中的某些依赖项。默认设置是在本地.m2文件夹(本地存储库)中查找,然后是POM中已配置的所有存储库,然后是中央Maven存储库。查看Maven参考资料的存储库部分

问题在于,签入的项目没有以可以找到所有依赖项并且可以从头开始构建项目的方式配置POM。


4

我想您在这里错过的是:

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

用于下载和部署的存储库由POM的存储库和distributionManagement元素定义。但是,某些设置(例如用户名和密码)不应与pom.xml一起分发。这种类型的信息应存在于构建服务器的settings.xml中。

这是使用自定义存储库的首选方式。因此,很可能正在发生的事情是此存储库的URL在构建服务器的settings.xml中。

掌握了网址和凭据后,您可以将它们放在您的计算机中:~/.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中。id internal-repository-group可以在每个项目中使用。您可以在设置xml中使用不同的ID设置多个存储库和凭据设置。

这种方法的优点是可以共享项目而不必担心凭据,也不必在每个项目中都提及凭据。

以下是使用“ internal-repository-group”的项目的示例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>

2

tl; dr

所有Maven POM都从基本Super POM继承。
下面的代码片段是Maven 3.5.4的Super POM的一部分。

  <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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.