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

use*_*163 62 java build-process maven-2 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/)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我做正确的事情,基本上我只是从命令行检查项目,cd-ed到目录并运行"mvn clean install" - 没有别的.任何帮助是极大的赞赏.

Pas*_*ent 67

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

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

事实上,如果你跑:

mvn help:effective-pom
Run Code Online (Sandbox Code Playgroud)

你至少会看到以下内容:

  <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>
Run Code Online (Sandbox Code Playgroud)

它有maven repo用于项目的绝对URL,但是maven仍然试图从普通的maven repo下载

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)
Run Code Online (Sandbox Code Playgroud)

所以,基本上,maven无法找到url.project:project:pom:x.x它,因为它在中央不可用.

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


Rom*_*las 30

默认情况下,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>
Run Code Online (Sandbox Code Playgroud)

这样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>
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到完整的settings.xml模型.

关于该clean过程,您可以要求Maven 脱机运行它.在这种情况下,Maven不会尝试访问任何外部存储库:

mvn -o clean 
Run Code Online (Sandbox Code Playgroud)

  • 在定义镜像时,切勿使用通配符"*"表达式,否则您将无法构建第三方供应商工具或在其poms中定义自定义存储库的示例项目. (4认同)

小智 5

tl;博士

所有 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>
Run Code Online (Sandbox Code Playgroud)


Tay*_*ese 3

基本上,Maven 告诉您的只是项目中的某些依赖项在中央 Maven 存储库中不可用。默认情况是查看本地 .m2 文件夹(本地存储库),然后查看 POM 中任何已配置的存储库,然后查看中央 Maven 存储库。查看Maven 参考的存储库部分。

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