Maven settings.xml 私服上传和拉取配置

时间:2024-07-19 07:49:17

公司内部自行开发的依赖包需要上传到maven私服时,可以在项目的pom.xml中配置,也可以在本地计算机的maven目录settings.xml中配置。本文讲述的是如何在settings.xml中进行配置。

场景:有两个maven私服,其中一个为公司的,另一个为个人的,每个私服都有release库和snapshot库,加起来一共4个库:

公司的:company-release  company-snapshot

个人的:personal-release  personal-snapshot

下面的配置代码中的注释描述了配置方法

<?xml version="1.0" encoding="UTF-8"?>
<settings
xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
    <!-- 本地仓库路径 -->
	<localRepository>D:\maven\repo</localRepository>
    <servers>
        <!-- server标签用来配置私服的用户名和密码,每个repo都对应一个server,
        咱们有4个repo(公司release,公司snapshot,个人release,个人snapshot),
        当然就有4个server块。
        -->
        <!--公司release -->
        <server>
            <!--server id要与profile中的repository id
            和altReleaseDeploymentRepository中的id一致 -->
            <id>company-release</id>
            <username>{your repo username}</username>
            <password>{your repo password}</password>
        </server>
        <!--公司snapshot -->
        <server>
            <id>company-snapshot</id>
            <username>{your repo username}</username>
            <password>{your repo password}</password>
        </server>
        <!--个人release -->
        <server>
            <id>personal-release</id>
            <username>{your repo username}</username>
            <password>{your repo password}</password>
        </server>
        <!--个人snapshot -->
        <server>
            <id>personal-snapshot</id>
            <username>{your repo username}</username>
            <password>{your repo password}</password>
        </server>
    </servers>
	
    <!-- 注意配置mirror时,mirrorOf一定要排除私服的repository id
         否则私服的仓库也会用mirror代理,导致找不到依赖。-->
    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <!-- mirrorOf表示这个镜像是哪些repository的镜像,
            这里声明的是这个镜像是central, jcenter的镜像,
            那么自然私服不会被镜像代理。
            如果某个镜像想代理除私服之外的所有repository,
            那么就要使用排除法,写法为:
            <mirrorOf>*,!company-release,!company-snapshot,!personal-release,!personal-                        
            snapshot</mirrorOf>
            上面的"*"表示该镜像代理所有repository,"!"表示排除这个repository,
            这样除了带"!"的repo以外的所有repo都会被该镜像代理。
            -->
            <mirrorOf>central,jcenter</mirrorOf>
            <name>mirror</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
    </mirrors>
    
    <profiles>
        <!-- 公司maven私服配置 -->
        <profile>
            <!-- profile id用于标识profile,当选择要激活哪个配置时会用到,下面会讲 -->
            <id>company</id>
            <properties>
                <!-- altReleaseDeploymentRepository用于配置推送信息 
                标签里面的值格式为:repository-id::default::url 
                其中repository-id和下文的repository标签里的id是一样的,
                当然也就和server id一样,这样才能正确传递用户名密码。
                -->
                <!-- altReleaseDeploymentRepository是release库信息
                当你往release库推送时会用到-->
                <altReleaseDeploymentRepository>
                    company-release::default::https://xxxx.xxx
				</altReleaseDeploymentRepository>	
                <!-- altSnapshotDeploymentRepository是snapshot库信息
                当你往snapshot库推送时会用到-->
				<altSnapshotDeploymentRepository>
                    company-snapshot::default::https://xxxx.xxx
				</altSnapshotDeploymentRepository>
            </properties>
            <repositories>
                <!-- repository用于配置拉取 -->
                <repository>
                    <!-- repository id要和server id保持一致,
                    才能正确传递用户名和密码。 -->
                    <id>company-release</id>
                    <!-- repo的url -->
                    <url>https://xxxx.xxx</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>company-snapshot</id>
                    <url>https://xxxx.xxx</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
        <!-- 个人的私服配置 -->
        <profile>
            <id>personal</id>
            <properties>
                <altReleaseDeploymentRepository>
                    personal-release::default::https://xxxx.xxx
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    personal-snapshot::default::https://xxxx.xxx
                </altSnapshotDeploymentRepository>
            </properties>
            <repositories>
                <repository>
                    <id>personal-release</id>
                    <url>https://xxxx.xxx</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>personal-snapshot</id>
                    <url>https://xxxx.xxx</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    </profiles>
	
	<!-- 当存在多个私服时,
    选择要推送给哪个私服修改这里即可,
    将 <activeProfile></activeProfile>标签中的值
    改为上面配置的profile中对应远程库的profile id。
    然后你的项目的pom文件中,
    版本号中如果是x.x.x-SNAPSHOT结尾(注意SNAPSHOT要大写)的,
    maven会自动上传到snapshot库,否则上传到release库。
    比如你的项目的pom文件中写的版本号是"0.0.1-SNAPSHOT",
    那么使用"mvn deploy"命令就会自动上传到快照库。
    -->
	<activeProfiles>
		<activeProfile>company</activeProfile>
	</activeProfiles>
    <!--这里选择的是company私服配置,
    那么如果项目的pom中写的版本号是"0.0.1-SNAPSHOT",
    使用"mvn deploy"命令就会上传到公司私服的snapshot库。
    也就是前面代码定义的id叫做"company-snapshot"的repository。
    如果要上传到company-release库,那么版本号就写成"0.0.1"即可。
    -->
</settings>