新的 Maven 依赖版本拉取 pom,而不是将 jar 放入私有 nexus 存储库中?
New maven dependency version pulling pom, not jar into private nexus repo?
我正在升级我在 java/maven/spring 应用程序中的一些依赖版本,它使用我们的 nexus 存储库作为镜像 maven central 的中央存储库。
我尝试将 hibernate 升级到最新版本的 3.5.4-Final,如下所示:
Hibernate newest release stable version
当我 运行 安装 maven 时,我在我的 Nexus 服务器中看到现在列出了 3.5.4-Final,但在其目录中只有一个 pom.xml 项目文件和 none 个相关联的 JAR。
当我检查 POM 时,我可以看到它的包装被列为 POM 而不是 JAR。
为什么会这样,如何让maven使用库的jar包版本而不仅仅是POM?
编辑 - 已发布 mvn 安装错误消息:
[ERROR] Failed to execute goal on project app: Could not resolve dependencies for project com.app:app:war:16.2.1-SNAPSHOT: Failure to find org.hibernate:hibernate:jar:3.5.4-Final in http://ssp-nexus1.mynexus-server.com:8081/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of company.nexus.mirror has elapsed or updates are forced -> [Help 1]
如您提供的 link 中所述
Aggregator of the Hibernate Core modules.
因此,您链接的工件实际上是一个 pom
,它聚合了(作为多模块)其他 Hibernate 工件。
相反,作为示例,hibernate-core
工件可以作为标准 Maven 依赖项(即 jar
)找到 here。
默认情况下依赖项有 type jar,因此如果您为依赖项添加 maven 坐标 (GAV) 而不是 pom 类型,maven 将查找它作为 jar。这就是为什么您会收到编辑中提到的错误的原因。
您应该从您的 pom 中删除它的依赖项,只添加您实际需要的休眠依赖项。根据经验,添加您在代码(例如导入语句)或配置文件中明确使用的依赖项,然后让 maven 处理所需的传递依赖项,前提是它们将在您的公司存储库中可用, 显然。
更新
根据您的最新评论和反馈,这里进一步解释了为什么仅更改现有 Hibernate 依赖项的版本就会遇到此问题:
- 新的3.5.4-Final和之前的3.2.7.ga版本共享相同的
groupId
和 Maven 存储库上的 artifactId
- 然而,前者的类型为
pom
(它是一个pom文件),而后者的类型为jar
(默认的)
- 因此,之前存在的版本工作正常,并且更改了您将其从
jar
切换到 pom
的依赖项的版本,破坏了 maven 解析(正在寻找 jar
而不是 pom
) 的版本
- 这主要是因为您从
ga
版本切换到 FINAL
版本。有关这些版本之间差异的进一步说明,您可以查看this SO question and this one
作为旁注,我发现更改版本号也会更改依赖类型有点不一致,这可能是一个争论点,但如果我是 Hibernate 团队,我会以不同的方式处理此版本管理。
我正在升级我在 java/maven/spring 应用程序中的一些依赖版本,它使用我们的 nexus 存储库作为镜像 maven central 的中央存储库。
我尝试将 hibernate 升级到最新版本的 3.5.4-Final,如下所示:
Hibernate newest release stable version
当我 运行 安装 maven 时,我在我的 Nexus 服务器中看到现在列出了 3.5.4-Final,但在其目录中只有一个 pom.xml 项目文件和 none 个相关联的 JAR。
当我检查 POM 时,我可以看到它的包装被列为 POM 而不是 JAR。
为什么会这样,如何让maven使用库的jar包版本而不仅仅是POM?
编辑 - 已发布 mvn 安装错误消息:
[ERROR] Failed to execute goal on project app: Could not resolve dependencies for project com.app:app:war:16.2.1-SNAPSHOT: Failure to find org.hibernate:hibernate:jar:3.5.4-Final in http://ssp-nexus1.mynexus-server.com:8081/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of company.nexus.mirror has elapsed or updates are forced -> [Help 1]
如您提供的 link 中所述
Aggregator of the Hibernate Core modules.
因此,您链接的工件实际上是一个 pom
,它聚合了(作为多模块)其他 Hibernate 工件。
相反,作为示例,hibernate-core
工件可以作为标准 Maven 依赖项(即 jar
)找到 here。
默认情况下依赖项有 type jar,因此如果您为依赖项添加 maven 坐标 (GAV) 而不是 pom 类型,maven 将查找它作为 jar。这就是为什么您会收到编辑中提到的错误的原因。
您应该从您的 pom 中删除它的依赖项,只添加您实际需要的休眠依赖项。根据经验,添加您在代码(例如导入语句)或配置文件中明确使用的依赖项,然后让 maven 处理所需的传递依赖项,前提是它们将在您的公司存储库中可用, 显然。
更新
根据您的最新评论和反馈,这里进一步解释了为什么仅更改现有 Hibernate 依赖项的版本就会遇到此问题:
- 新的3.5.4-Final和之前的3.2.7.ga版本共享相同的
groupId
和 Maven 存储库上的artifactId
- 然而,前者的类型为
pom
(它是一个pom文件),而后者的类型为jar
(默认的) - 因此,之前存在的版本工作正常,并且更改了您将其从
jar
切换到pom
的依赖项的版本,破坏了 maven 解析(正在寻找jar
而不是pom
) 的版本
- 这主要是因为您从
ga
版本切换到FINAL
版本。有关这些版本之间差异的进一步说明,您可以查看this SO question and this one
作为旁注,我发现更改版本号也会更改依赖类型有点不一致,这可能是一个争论点,但如果我是 Hibernate 团队,我会以不同的方式处理此版本管理。