我有一个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文件。
答案 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服务器的人员取得联系,以便他们解决问题。