首页 文章

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

提问于
浏览
51

我刚刚检查了一些项目并且需要构建它们,但是我很久以前安装了Maven(可能是6个月?)而且确实没有't used it since - the pom.xml for the project I have doesn'在其中的任何地方都有“http://repo1.maven.org/myurlhere” - 它有绝对的网址,其中maven repo是对于该项目,但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” - 没有别的 . 任何帮助是极大的赞赏 .

4 回答

  • 4

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

    All 项目默认声明为 <repository> (和 <pluginRepository> ) . 此存储库称为中央存储库,与"Super POM"中的其他默认设置(所有项目都继承自Super POM)一样继承 . 所以POM实际上是Super POM,任何父POM和当前POM的组合 . 这个组合称为"effective 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将尝试在声明的所有存储库中查找依赖项,包括在我们看到的默认存储区中 . 但是,根据您显示的跟踪,您只能定义 one 存储库(中央存储库)或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 ,因为它在中央不可用 .

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

  • 0

    默认情况下,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://the/server ),而不是联系 http://repo1.maven.org .

    如果要添加另一个存储库,可以在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
    
  • 60

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

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

  • 26

    我想你在这里错过的是:

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

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

    这是使用自定义存储库的首选方式 . 所以可能发生的事情是这个repo的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>
    

相关问题