我的团队正在将我们的代码迁移到Azure环境,Microsoft自己的主题文章介绍了如何在Azure环境中使用Maven: https://docs.microsoft.com/en-us/azure/devops/java/labs/mavenpmvsts/?view=vsts
Maven的最佳实践之一是避免在pom文件中定义存储库元素,而使用在settings.xml中配置的存储库管理器。
Microsoft文章另有指示:他们说要在pom文件中添加存储库URL。
如果仅在distributionManagement部分中定义了存储库元素,我就可以了,但事实并非如此。本文在分发上下文之外的repositories元素中定义了url。
我对pom.xml文件的存储库元素的理解是,它覆盖了用于获取依赖项的工件的来源。我看到在pom文件中定义它的问题是,它可能会产生不利影响,具体取决于如何重用该库。
用例示例: 1)使用pom中定义的存储库URL创建共享库 2)部署共享库。包含URL的POM文件和JAR文件被发布。 3)工件库已移动,重命名或复制,URL已更改。 4)之后,创建使用该共享库的新应用程序,但使用新的存储库URL。现在,应用程序pom中的URL与共享库以前发布的pom中的URL不同。
由于Maven使用依赖图和继承,所以我期望发生的是在构建新应用程序时:
1)maven将读取应用程序pom文件,并开始通过从应用程序pom中找到的URL下载应用程序每个依赖项的pom文件来探索依赖关系图。在这种情况下,唯一的下载是共享库的pom。
2)maven将探索传递依赖关系并读取共享库的pom。读取共享库的pom时,在共享库依赖项的上下文中,存储库部分将优先于应用程序的pom。共享库的依赖项poms将从旧的URL下载。
3)maven将像这样继续并下载所有pom文件,直到构建了依赖关系树为止。
4)根据项目配置,maven将使用相同的规则浏览它构建的图以下载jar等。
在此用例中,maven将从旧源和新源两者中下载工件。如果旧的源不再存在或无法在此构建上下文中访问,则无法构建项目。这就是为什么最好避免在pom文件中设置存储库网址的原因。
或者我想。
我用本地存储库编写了一个脚本演示,向我的团队展示了会发生什么,并且令我惊讶的是,即使Maven确实下载了包含不同存储库URL的共享库的pom文件,存储库标签似乎也不能覆盖一个来自正在构建的应用程序。日志显示了从“顶部”应用程序pom中指定的源下载的所有工件。
所以我对堆栈溢出的问题有两个方面:
1)为什么我错了?我是否误解了Maven的继承,依赖关系图的建立和行为?
2)如果指定了Maven,是否应该从存储库标记中指定的url下载共享库的依赖项?我确信在某些情况下工件必须来自私有存储库。 (例如:org.geotools)
3)是否有人有在Azure上设置Maven的经验?您是否遵循Microsoft的指南或找到了在Azure环境中将存储库URL移至settings.xml的方法?