如何配置maven的全局settings.xml文件将jar上传到nexus
注意,项目中的pom.xml不要做任何配置。
假设公司内部有非常多 Maven 项目,需要 deploy 到一个内部 maven 私有仓库中。
如果希望 maven deploy
命令可以成功执行,一般需要在 pom.xml
中添加:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
但需要 deploy 的项目很多的情况下,我们肯定不希望在每个项目的 pom 文件中都重复添加这个配置。
方案一
为所有项目增加一个公共的 parent pom 项目。那么只需要在这个项目的 pom 文件中添加:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
</project>
然后使其他项目的 parent 项目变成这个项目:
<parent>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0</version>
</parent>
方案二
方案一存在两个问题:
- 如果代码泄露或将代码开源,会使该内部私有仓库的地址被暴露
- 私有仓库这种环境配置信息最好和代码分离。类似通过配置中心,将数据库地址等配置和代码分离。
我们完全可以将这个配置放到 maven 中。
可以通过 mvn
命令的启动参数来实现:
-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases
更好的方法是将其配在 settings.xml
中:
<settings>
[...]
<profiles>
<profile>
<id>nexus</id>
<properties>
<altSnapshotDeploymentRepository>maven-snapshots::default::https://YOUR_NEXUS_URL/repositoryId</altSnapshotDeploymentRepository>
<altReleaseDeploymentRepository>maven-releases::default::https://YOUR_NEXUS_URL/repositoryId</altReleaseDeploymentRepository>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
<servers>
<server>
<id>maven-releases</id>
<username>admin</username>
<password>xxxxxx</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>xxxxxx</password>
</server>
</servers>
</settings>
repositoryId是在仓库中建立的仓库名称,注意,如果希望release和snapshot的仓库共用一个,在新建仓库时注意类型要选:mixed
这样就可以releases和snapshots都可以填一个地址了,否则就要建两个仓库,一个snapshots,一个releases类型。
有些项目可能会遇到deploy的时候报这个错:
如果报这个错,pom.xml加入以下插件:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>