如何让Maven使用正确的仓库?

78

我刚刚检出了一些项目并需要构建它们,但是我安装Maven已经有一段时间了(可能是6个月前?)而且自那以后一直没有使用它。对于我所拥有的这个项目的pom.xml文件中没有"http://repo1.maven.org/myurlhere"这个内容 - 它只有Maven存储库的绝对url,但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/)

有人能帮我看看我做错了什么吗?
基本上,我只是从命令行检出项目,进入目录并运行了mvn clean install - 除此之外没有别的操作。
非常感谢任何帮助。

6个回答

87
我所拥有项目的pom.xml文件中没有包含"http://repo1.maven.org/myurlhere"这个地址。所有的项目默认都有声明http://repo1.maven.org/<repository>(和<pluginRepository>)。这个叫做"中央"仓库的存储库是从"Super POM"继承的,就像其他默认设置一样(所有项目都从Super POM继承)。因此,一个POM实际上是Super POM、任何父POM以及当前POM的组合。这个组合被称为"effective POM",可以使用Maven Help插件的effective-pom目标打印出来(用于调试)。

实际上,如果你运行以下命令:

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,因为它在中央仓库中不可用。

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


1
要查看它运行时检查的确切位置,请运行 mvn -U dependency:resolve-U 强制 mvn 重试,否则它会将失败缓存为元数据。 - Adam
1
谢谢!这个答案帮助了我!pluginRepository 是关键(除了 repository ),因为引用了“那个”(第三方)仓库的插件。 - Sergey Vyacheslavovich Brunov
1
请注意,URL已更改为“https”[MavenCentral](https://repo1.maven.org/maven2/) - Darren Parker

36

默认情况下,Maven总是会查找官方Maven仓库(http://repo1.maven.org)。

当Maven尝试构建项目时,它会查找您本地的仓库(默认为~/.m2/repository,但您可以通过更改~/.m2/settings.xml中的<localRepository>值来进行配置),以查找在您的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>

这种方式,Maven不会联系http://repo1.maven.org,而是会联系你企业的仓库(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在clean期间不会解决依赖项,无需离线运行(至少不需要使用maven 2.2.1和clean插件2.2)。 - Pascal Thivent
6
请勿在定义镜像时使用通配符“*”表达式,否则您将无法构建定义了自定义存储库的第三方供应商工具或示例项目。 - Dave
在我的项目pom.xml文件中,定义和覆盖这个的等效方式是什么? - powder366
为什么<mirror>会覆盖中央仓库? - zygimantus
1
这是很好的信息。但是你上面所说的中央Maven仓库是http://repo1.maven.org还是http://repo.maven.apache.org/maven2,就像http://maven.apache.org/pom.html#Repositories上显示的那样? - Woodchuck

9

简述:

所有 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>

4
我认为你在这里忽略了这个:

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

下载和部署的存储库由POM的repositories和distributionManagement元素定义。但是,诸如用户名和密码之类的某些设置不应与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 文件中。ID internal-repository-group 可以在每个项目中使用。您可以使用设置文件中的不同 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>

3
基本上,Maven 告诉你的是你项目中某些依赖项在中央 Maven 存储库中不可用。默认情况下,它会查找你本地的 .m2 文件夹(本地存储库),然后是 POM 中配置的任何存储库,最后是中央 Maven 存储库。请参考 Maven 参考文献的存储库 section 部分。
问题在于检查进来的项目没有以这样的方式配置 POM,以至于无法找到所有依赖项并从头构建该项目。

0

修改您的Maven文件夹中的settings.xml,例如 C:\ Program Files \ apache-maven-3.6.3 \ conf 请检查上面的路径..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接