Maven依赖没有得到相应的POM文件下载

时间:2014-09-04 11:37:22

标签: java maven nexus

我有一个maven项目,它具有从远程Nexus存储库获取的依赖项。我相信依赖关系不是用maven构建的,只是上传了一个准系统POM文件。服务器上的布局看起来很好,所以它可能部署了maven。

当maven将依赖项下载到我的本地存储库时,它会下载jar文件,但是没有获得POM。在构建时,会发出一条警告,指出无法找到POM,也没有可用的依赖信息。我实际上并没有直接使用它的任何代码(它实际上是一个传递依赖),所以构建成功完成。

当我尝试为我的项目执行网站生成时,会出现真正的问题。尝试生成依赖关系图报告的部分失败,因为它无法找到要使用此依赖关系的POM。

我无法弄清楚为什么我没有下载POM,当它的jar文件下载得很好。

该特定依赖项的POM文件看起来像这样(你可以看到为什么我不认为它是用maven构建的:))

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company.component</groupId>
    <artifactId>my-artifact</artifactId>
    <version>1.0.1</version>
</project>

您会注意到根<project>元素不包含任何命名空间或架构信息。这有关系吗?难道Nexus不承认它是POM吗?除了一些小的句法字符丢失或错误的可能性,这是我目前的思路......请不要让它影响你可能有的任何想法! :)

此外,在进行故障排除时,我已将远程POM文件的内容粘贴到我本地.m2 repo中的正确文件位置。当我这样做时,一切都很好。这不是一个可接受的修复,因为我们需要在我们的CI构建服务器上完成构建。

非常感谢任何帮助/建议!

修改

我设法暂时解决了我的实际问题,但这里的陌生感仍然存在。我通过从我的pom中的依赖关系明确地排除依赖于此的东西解决了这个问题(至少两步之外的故障,我没有使用任何使用拉动物的东西)它在):

<dependency>
    <groupId>com.company.utility</groupId>
    <artifactId>shared-utility</artifactId>
    <version>1.2.3</version>

    <exclusions>
        <exclusion>
            <groupId>com.company.common.component</groupId>
            <artifactId>thing-that-puls-in-bad-artifact</artifactId>
        </exclusion>
    </exclusions>
</dependency>

我已经使用以下POM创建了一个虚拟项目来证明它:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company.project</groupId>
    <artifactId>my-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.company.component</groupId>
            <artifactId>bad-artifact</artifactId>
            <version>1.0.1</version>
        </dependency>
    </dependencies>
</project>

现在~/.m2/repository/com/company/compnent/bad-artifact/1.0.1/,我得到了:

_remote.repositories
bad-artifact-1.0.1.jar
bad-artifact-1.0.1.jar.sha1
bad-artifact-1.0.1.pom.lastUpdated

没有实际的POM文件。

2 个答案:

答案 0 :(得分:2)

与您的实际问题无关,但对于maven(至少是最新版本),生成的jar在该jar的pom.xml文件夹中包含其META-INF/maven

您应该尝试使用-e -X运行maven,并移动本地存储库以强制Maven下载所有再次

mv "~/.m2/repository" "~/.m2/repository.old"
mvn -X -e dependency:tree

[edit]它最初是评论,但它太长了:

据我了解您的问题,我认为这是Nexus的错误,而不是您的计算机上的错误。任何有效的解决方案都需要你弄乱你的公司Nexus。如果您无权使用公司Nexus执行任何操作,则可以使用local Nexus进行测试。

您还可以在~/.m2/settings.xml中强制使用该Nexus,如下所示:

<mirrors>
    <mirror>
      <id>nexus-local-central</id>
      <mirrorOf>central</mirrorOf>
      <url>http://localhost:8081/nexus/content/repositories/central</url>
    </mirror>
    <mirror>
      <id>nexus-local-any</id>
      <mirrorOf>external:*</mirrorOf>
      <url>http://localhost:8081/nexus/content/groups/public</url>
    </mirror>
</mirrors>

你不应该失去太多时间来解决它失败的原因,而应该专注于让它发挥作用。

为此,我认为你应该为该工件编写一个有效的pom.xml,并使用pomFile选项在服务器上重新部署它:

mvn deploy:deploy-file -DpomFile=valid-pom.xml -Dfile=foobar.jar -Durl=http://nexus:8081 -DrepositoryId=company-nexus-deploy

或者如果你太懒(或者如果此命令失败),请从Nexus GUI执行此操作!

PS:Nexus的默认管理员登录名/密码为admin/admin123,我认为还有deploy/deploy123用于部署。我见过的大多数Nexus都没有配置为使用其他登录名/密码。

答案 1 :(得分:1)

如果您查看_remote.repositories内部,则此文件可能包含以下信息:&#34;上次下载POM失败,请勿再次尝试。&#34;

这是Maven的政策之一,不会再尝试下载版本&#34;妨碍你。尝试删除文件夹~/.m2/repository/com/company/compnent/bad-artifact/1.0.1/并再次运行Maven以查看错误。

Maven很可能拒绝使用这样一个破解的POM,因为根元素没有正确的XML命名空间。但是如果没有看到实际的错误信息,很难说清楚。

解决此问题的方法是下载JAR并从命令行使用mvn install:install-file来在本地安装依赖项。更好的是,您可以使用mvn deploy:deploy-file将其部署到您自己的Nexus服务器上,这样所有其他开发人员现在就可以获得一个好的&#34; POM的版本。

您还应该与运行远程Nexus服务器的人员取得联系,以便他们解决问题。