天天看點

Maven:配置Maven從Nexus下載下傳構件(配置私服)。

當需要為項目添加Nexus私服上的public倉庫時,可以按下面所示配置。

<project>
...
    <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
            <releases><enabled>true</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
    </pluginRepositories>
...
</project>
           

這樣的配置隻對目前Maven項目有效,在實際應用中,我們往往想要通過一次配置就能讓本機所有的Maven項目都使用自己的Maven私服。這個時候可能會想到settings.xml檔案,該檔案中的配置對所有本機Maven項目有效,但是settings.xml并不支援直接配置repositories和pluginRepositories。所幸Maven還提供了Profile機制,能讓使用者将倉庫配置放到setting.xml中的Profile中,如下所示。

<settings>
...
    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>nexus</id>
                    <name>Nexus</name>
                    <url>http://localhost:8081/nexus/content/groups/public/</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>nexus</id>
                    <name>Nexus</name>
                    <url>http://localhost:8081/nexus/content/groups/public/</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </pluginRepository>
            </pluginRepositories>
        <profile>
    </profiles>
...
</settings>
           

這配置中使用了一個id為nexus的profile,這個profile包含了相關的倉庫配置,同時配置中又使用activeProfile元素将nexus這個profile激活,這樣當執行Maven建構的時候,激活的profile會将倉庫配置應用到項目中去。

上面的配置已經能讓本機所有的Maven項目從Nexus私服下載下傳構件。Maven除了從Nexus下載下傳構件之外,還會不時的通路中央倉庫central,我們希望的是所有Maven下載下傳請求都僅僅通過Nexus,以全面發揮私服的作用。這個時候就需要借助于Maven鏡像配置了。可以建立一個比對任何倉庫的鏡像,鏡像的位址為私服,這樣,Maven對任何倉庫的構件下載下傳請求都會轉到私服中。具體配置如下所示。

<settings>
...
    <mirrors>
        <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>http://central</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                <repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://central</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
...
</settings>
           

這裡需要解釋的是倉庫及插件倉庫配置,他們的id都為central,也就是說,覆寫了超級POM中央倉庫的配置,他們的url已無關緊要,因為所有請求都會通過鏡像通路私服位址。配置倉庫及插件倉庫的主要目的是開啟對快照版本下載下傳的支援,當Maven需要下載下傳釋出版或快照版構件的時候,他首先檢查central,看該類型的構件是否支援,得到正面回答之後,再根據鏡像比對規則轉而通路私服倉庫位址。