哪里是为maven项目指定所需存储库的最佳位置,pom.xml
或settings.xml
?每个地点的利弊是什么?什么是最佳做法?
在我看来,由于以下几个原因,在POM中定义存储库更好:
也许一个问题是,如果存储库的位置将来发生变化,则需要安装代理或者需要发布旧软件的补丁版本,指定新的存储库位置(或者.m2/settings.xml
总是可以提供额外的存储库作为最后的手段)。然而,这似乎是发布管理中良好的可重复性和可移植性的必要结果,而不是con。
还有其他想法吗?
为maven项目,pom.xml或settings.xml指定所需存储库的最佳位置在哪里?每个地点的利弊是什么?什么是最佳做法?
我个人定义项目pom.xml
中特定项目所需的存储库,因为它使构建可移植。 settings.xml
文件只应在我看来用于特定用户或秘密事物。不,真的,要求用户添加存储库位置,即使这是正确记录的,以某种方式击败了maven的一个功能(透明依赖性处理),我不喜欢这个想法。
我可以想到使用settings.xml
处理存储库的唯一“好”用例是当你有一个公司存储库并希望Maven使用这个存储库而不是公共存储库。例如,要避免与任何公共存储库的连接,您可以将公司存储库声明为所有公共存储库的镜像:
<settings>
...
<mirrors>
<mirror>
<id>proxy-of-entire-earth</id>
<mirrorOf>*</mirrorOf>
<name>Maven Repository Manager running on repo.mycompany.com</name>
<url>http://repo.mycompany.com/proxy</url>
</mirror>
</mirrors>
...
</settings>
我总是把URL放在POM中,密码放在settings.xml中。如果您将URL放在settings.xml中,则要求您的用户在您的URL发生更改时更新其本地系统上的文件。如果在POM中指定了URL,则可以更改它并推送新版本。网址更改的次数比大多数人预测的更频繁,并且会在构建中断时导致受挫的用户。
出于显而易见的原因,密码保存在settings.xml中。密码不应保留在版本控制中。您需要密码才能将mvn部署功能部署到远程存储库。
我将告诉您为什么要考虑在settings.xml
而不是pom.xml
中存储存储库URL的三个原因:
如果您有公司仓库,并且您正在为客户构建项目,并且您必须在最后交付源代码,则最好在settings.xml中配置repos。每次在办公室外建立项目时,您都不希望获得您的Artifactory(或类似物)。
settings.xml
中放置了URL。java.net
),您只需要在一个地方更正URL。如果您使用过pom.xml
,之前的所有版本都会被破坏。您可能必须为每个发布版本提交一个固定的pom.xml
。在settings.xml
中配置URL比pom.xml
更有效吗?绝对。
它会给你带来更大的灵活性吗?绝对。
这是settings.xml
应该是什么样子:
<settings>
<profiles>
<profile>
<id>mycompany-servers</id>
<repositories>
<repository>
<id>mycompany-release</id>
<url>https://mycompany.com/release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>mycompany-snapshot</id>
<url>https://mycompany.com/snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>mycompany-servers</activeProfile>
</activeProfiles>
<servers>
<server>
<id>mycompany-release</id>
<username>your-username</username>
<password>your-api-key</password>
</server>
<server>
<id>mycompany-snapshot</id>
<username>your-username</username>
<password>your-api-key</password>
</server>
</servers>
</settings>