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

时间:2010-03-02 06:28:45

标签: java maven-2 build-process build

我刚检查了一些项目并需要构建它们,但是我很久以前安装了Maven(可能是6个月?)并且从那时起就没有使用它 - 我所拥有的项目的pom.xml没有在它的任何地方都有这个“http://repo1.maven.org/myurlhere” - 它有maven repo用于项目的绝对URL,但是maven仍在尝试从普通的maven repo下载:

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” - 没有别的。非常感谢任何帮助。

5 个答案:

答案 0 :(得分:61)

  

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

默认情况下,所有项目都http://repo1.maven.org/声明为<repository>(和<pluginRepository>)。此存储库称为中央存储库,与“Super POM”中的其他默认设置(所有项目继承自Super POM)一样继承。所以POM实际上是Super POM,任何父POM和当前POM的组合。这种组合称为“有效POM”,可以使用Maven帮助插件的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 repo用于项目的绝对URL,但是maven仍然试图从普通的maven repo下载

Maven将尝试在声明的所有存储库中查找依赖项,包括在我们看到的默认存在的 central 中。但是,根据您显示的跟踪,您只能定义一个存储库(中央存储库)或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 :(得分:29)

默认情况下,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>

这样,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模型here

关于clean进程,您可以让Maven运行离线。在这种情况下,Maven不会尝试访问任何外部存储库:

mvn -o clean 

答案 2 :(得分:4)

基本上,所有Maven都告诉您,项目中的某些依赖项在中央maven存储库中不可用。缺省情况是查看本地.m2文件夹(本地存储库),然后查看POM中的所有已配置存储库,然后查看中央maven存储库。查看Maven参考的存储库section

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

答案 3 :(得分:0)

我认为您在这里错过的是:

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>

答案 4 :(得分:0)

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>