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-central | proxy | Nexus 會幫我地自動 proxy 去 Maven Central public repository 度下載 artifacts,同埋幫我地 cache 低呢啲 artifacts 喺 Nexus 既儲存空間裡面。 |
maven-releases | hosted | 一個儲存 Maven artifacts 既 Nexus 儲存空間,會儲存正式版本(冇 -SNAPSHOT suffix 既版本號碼)既 Maven artifacts。 |
maven-snapshots | hosted | 一個儲存 Maven artifacts 既 Nexus 儲存空間,會儲存帶有 -SNAPSHOT suffix 既版本號碼既 Maven artifacts。 |
maven-public | group | 呢個 repository group 默認包括 maven-central 、maven-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 帳號既密碼。
- 初始密碼可以喺 Docker container 裡面既
/nexus-data/admin.password
檔案度搵到。
- 喺瀏覽器開啟 http://localhost:8081。
- 輸入個初始密碼,然後輸入新密碼:
password
。
- 可以揀「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
- 建立好個 Maven Java library 測試項目。
- 刪除本地 Maven repo 既
org/apache/commons/commons-lang3/3.17.0
(默認喺 %USERPROFILE%/.m2/repository
),令 Maven 要重新下載佢既 artifact。
- 喺個 Maven Java library 測試項目裡面執行:
- 如果想用
%USERPROFILE%/.m2/settings.xml
以及 %USERPROFILE%/.m2/repository
:
- 如果想用 project directory 裡面既
settings.xml
以及 .m2
folder:
- Maven CLI 既 console log 會顯示:
- 檢查
maven-central
以及 maven-releases
有冇多左 JAR artifacts 以及 POM 檔。
2.4.2 測試上載正式版本
- 建立好個 Maven Java library 測試項目。
- 喺個 Maven Java library 測試項目裡面執行
mvn clean deploy
。
- Maven CLI 既 console log 會顯示:
- 檢查
maven-central
以及 maven-releases
有冇多左 JAR artifacts 以及 POM 檔。
- 如果再執行
mvn clean deploy
既話,Maven CLI 會失敗,咁係因為 Nexus 唔畀我地 overwrite 正式版本既 artifacts。
2.4.3 測試上載 SNAPSHOT
版本
- 將個 Maven Java library 測試項目既
pom.xml
裡面既 <version>
改成 1.0.0-SNAPSHOT
。
- 喺個 Maven Java library 測試項目裡面執行
mvn clean deploy
。
- Maven CLI 既 console log 會顯示:
- 檢查
maven-snapshots
有冇多左 JAR artifacts 以及 POM 檔。
- 如果再執行
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 參考資料