➜ Old React website
Chung Cheuk Hang MichaelJava Web Developer
JMeter performance testingSpring Boot 項目使用 Swagger/OpenAPI

自建 Nexus Maven repo

Table of contents

1 Nexus 簡介

Nexus 係 Sonatype 公司既一個 artifact repository manager 產品,可以畀我地儲存唔同 package managers 既 artifacts,包括:
  • Maven artifacts,例如 POM、JAR、plugin、archetype
  • npm artifacts
  • Docker image artifacts

1.1 關於 repositories

根據 Nexus 既默認 repositories 既設定:
Repository類型描述
maven-centralproxyNexus 會幫我地自動 proxy 去 Maven Central public repository 度下載 artifacts,同埋幫我地 cache 低呢啲 artifacts 喺 Nexus 既儲存空間裡面。
maven-releaseshosted一個儲存 Maven artifacts 既 Nexus 儲存空間,會儲存正式版本(冇 -SNAPSHOT suffix 既版本號碼)既 Maven artifacts。
maven-snapshotshosted一個儲存 Maven artifacts 既 Nexus 儲存空間,會儲存帶有 -SNAPSHOT suffix 既版本號碼既 Maven artifacts。
maven-publicgroup呢個 repository group 默認包括 maven-centralmaven-releases 以及 maven-snapshots

2 步驟

2.1 建立 Nexus server

2.1.1 啟動 Nexus server

我地可以用 Sonatype Nexus 既 Docker image:
docker container run -d --rm -p 8081:8081 -v "C:/docker-data/nexus:/nexus-data" --name nexus sonatype/nexus3:latest
執行完之後,要等佢幾分鐘去啟動。

2.1.2 設置 admin 帳號

第一次建立 Nexus server 既話,我地需要改 admin 帳號既密碼。
  1. 初始密碼可以喺 Docker container 裡面既 /nexus-data/admin.password 檔案度搵到。
    • docker container exec nexus cat /nexus-data/admin.password
  2. 喺瀏覽器開啟 http://localhost:8081
  3. 輸入個初始密碼,然後輸入新密碼:password
  4. 可以揀「Enable anonymous access」。
之後就完成。

2.2 本地 user-specific Maven settings 配置

將下面既檔案放喺 %USERPROFILE%/.m2/settings.xml
1<settings> 2 3 <servers> 4 <server> 5 <id>nexus</id> 6 <username>admin</username> <!-- Nexus 既登入帳號 --> 7 <password>password</password> <!-- Nexus 既登入密碼 --> 8 </server> 9 </servers> 10 11 <!-- 可能需要 12 <mirrors> 13 <mirror> 14 <id>nexus</id> 15 <mirrorOf>*</mirrorOf> 16 <url>http://localhost:8081/repository/maven-public/</url> 17 </mirror> 18 </mirrors> 19 --> 20 21 <profiles> 22 <profile> 23 <id>nexus</id> 24 25 <repositories> 26 <repository> 27 <id>nexus</id> 28 <url>http://localhost:8081/repository/maven-public/</url> 29 </repository> 30 </repositories> 31 32 <pluginRepositories> 33 <pluginRepository> 34 <id>central</id> 35 <url>http://localhost:8081/repository/maven-public/</url> 36 </pluginRepository> 37 </pluginRepositories> 38 </profile> 39 </profiles> 40 41 <activeProfiles> 42 <activeProfile>nexus</activeProfile> 43 </activeProfiles> 44</settings>

2.3 Maven 測試項目

我地可以建立一個 Maven Java library 測試項目。
pom.xml 例子:
1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.michael</groupId> 8 <artifactId>my-lib</artifactId> 9 <version>1.0.0</version> 10 <packaging>jar</packaging> 11 12 <name>my-lib</name> 13 <description>my-lib</description> 14 15 <properties> 16 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 17 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 18 <java.version>17</java.version> 19 <javac.source>17</javac.source> 20 <javac.target>17</javac.target> 21 <maven.compiler.target>17</maven.compiler.target> 22 <maven.compiler.source>17</maven.compiler.source> 23 </properties> 24 25 <dependencies> 26 <dependency> 27 <groupId>org.apache.commons</groupId> 28 <artifactId>commons-lang3</artifactId> 29 <version>3.17.0</version> 30 </dependency> 31 </dependencies> 32 33 <!-- 影響 mvn deploy 會 upload 呢個 artifact 去邊度 --> 34 <distributionManagement> 35 <repository> 36 <id>nexus</id> <!-- Username、password 黎自 settings.xml --> 37 <url>http://localhost:8081/repository/maven-releases</url> 38 </repository> 39 <snapshotRepository> 40 <id>nexus</id> <!-- Username、password 黎自 settings.xml --> 41 <url>http://localhost:8081/repository/maven-snapshots</url> 42 </snapshotRepository> 43 </distributionManagement> 44</project>
之後寫啲 Java code 就得。

2.4 測試

2.4.1 測試下載 dependencies

  1. 建立好個 Maven Java library 測試項目。
  2. 刪除本地 Maven repo 既 org/apache/commons/commons-lang3/3.17.0(默認喺 %USERPROFILE%/.m2/repository),令 Maven 要重新下載佢既 artifact。
  3. 喺個 Maven Java library 測試項目裡面執行:
    • 如果想用 %USERPROFILE%/.m2/settings.xml 以及 %USERPROFILE%/.m2/repository
      • mvn clean compile
    • 如果想用 project directory 裡面既 settings.xml 以及 .m2 folder:
      • mvn clean compile --settings settings.xml -Dmaven.repo.local=.m2
  4. Maven CLI 既 console log 會顯示:
    • Downloading from nexus: http://localhost:8081/repository/maven-public/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.pom Downloaded from nexus: http://localhost:8081/repository/maven-public/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.pom Downloading from nexus: http://localhost:8081/repository/maven-public/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar Downloaded from nexus: http://localhost:8081/repository/maven-public/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar
  5. 檢查 maven-central 以及 maven-releases 有冇多左 JAR artifacts 以及 POM 檔。

2.4.2 測試上載正式版本

  1. 建立好個 Maven Java library 測試項目。
  2. 喺個 Maven Java library 測試項目裡面執行 mvn clean deploy
  3. Maven CLI 既 console log 會顯示:
    • 1Uploading to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/1.0.0/my-lib-1.0.0.pom 2Uploaded to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/1.0.0/my-lib-1.0.0.pom 3Uploading to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/1.0.0/my-lib-1.0.0.jar 4Uploaded to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/1.0.0/my-lib-1.0.0.jar 5Downloading from nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/maven-metadata.xml 6Uploading to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/maven-metadata.xml 7Uploaded to nexus: http://localhost:8081/repository/maven-releases/com/michael/my-lib/maven-metadata.xml
  4. 檢查 maven-central 以及 maven-releases 有冇多左 JAR artifacts 以及 POM 檔。
  5. 如果再執行 mvn clean deploy 既話,Maven CLI 會失敗,咁係因為 Nexus 唔畀我地 overwrite 正式版本既 artifacts。

2.4.3 測試上載 SNAPSHOT 版本

  1. 將個 Maven Java library 測試項目既 pom.xml 裡面既 <version> 改成 1.0.0-SNAPSHOT
  2. 喺個 Maven Java library 測試項目裡面執行 mvn clean deploy
  3. Maven CLI 既 console log 會顯示:
    • 1Downloading from nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/maven-metadata.xml 2Uploading to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/my-lib-1.0.0-20250710.133717-1.pom 3Uploaded to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/my-lib-1.0.0-20250710.133717-1.pom 4Uploading to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/my-lib-1.0.0-20250710.133717-1.jar 5Uploaded to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/my-lib-1.0.0-20250710.133717-1.jar 6Downloading from nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/maven-metadata.xml 7Uploading to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/maven-metadata.xml 8Uploaded to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/1.0.0-SNAPSHOT/maven-metadata.xml 9Uploading to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/maven-metadata.xml 10Uploaded to nexus: http://localhost:8081/repository/maven-snapshots/com/michael/my-lib/maven-metadata.xml
  4. 檢查 maven-snapshots 有冇多左 JAR artifacts 以及 POM 檔。
    • 喺瀏覽器開啟 Nexus maven-snapshots 介面 或者 maven-snapshots index page,然後檢查:
      • /com/michael/my-lib
        • /1.0.0-SNAPSHOT
          • /1.0.0-20250710.133717-1
            • my-lib-1.0.0-20250710.133717-1.jar
            • my-lib-1.0.0-20250710.133717-1.pom
          • maven-metadata.xml
        • maven-metadata.xml
  5. 如果再執行 mvn clean deploy 既話,Maven CLI 都會成功上載到,咁係因為再次上載既檔案名會同之前上載既唔同。
    • SNAPSHOT 版本既 artifact 檔案名包含左 timestamp,而且數字部分亦會自動 increment,例如 1.0.0-20250710.134018-2
    • 對用呢個 artifact 作為 dependency 既 Maven 項目黎講,dependency 版本號碼都一樣係 1.0.0-SNAPSHOT
    • 如果更新左同一個 artifact 既 SNAPSHOT 版本,喺 downstream projects 執行 mvn clean compile 之前:
      • 最好既方法:先手動刪除本地 Maven repo 既 cache,令 Maven 要重新下載呢個 SNAPSHOT 版本最新既 artifact;
      • 次選既方法:用 Maven CLI 既 -U option。

3 參考資料