我刚检查了一些项目并需要构建它们,但是我很久以前安装了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” - 没有别的。非常感谢任何帮助。
答案 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>