使用 Maven 定義多個儲存庫
1. 概述
Apache Maven 允許我們定義一個儲存庫或一個儲存和檢索專案工件的中心位置。有時,我們需要定義多個儲存庫,特別是當我們的專案依賴僅在特定儲存庫中可用的庫時。
在本教程中,我們將探索在 Maven 中執行此操作的兩種主要方法:透過settings.xml
檔案和pom.xml
檔案。
2. 將我們自己的第三方JAR上傳到私人儲存庫
為了示範這些方法,我們首先將簡單的GreeterServiceExample
部署到私人遠端儲存庫:
public class GreeterServiceExample {
public Greeting greetInYourLanguage(String language) {
return switch (language.toLowerCase()) {
case "english" -> new Greeting("Hello", new Language("English", "en"));
case "spanish" -> new Greeting("Hola", new Language("Spanish", "es"));
case "xhosa" -> new Greeting("Molo", new Language("Xhosa", "xh"));
default -> null;
};
}
}
此範例服務根據所選語言傳回特定於語言的Greeting
語。
在部署工件之前,我們需要在 POM 或settings.xml
檔案中指定儲存庫詳細資訊:
<repositories>
<repository>
<id>internal-maven-repo</id>
<name>Internal Repository</name>
<url>https://host/internal-maven-packages</url>
</repository>
<!-- Other repositories -->
</repositories>
接下來,讓我們透過新增指定內部儲存庫的身份驗證資訊的server
指令來更新我們的settings.xml
:
<server>
<id>internal-maven-repo</id>
<username>username</username>
<password>passphrase_or_token</password>
</server>
除了身份驗證憑證之外,我們還指定了儲存庫配置引用的唯一 ID。
現在,讓我們將範例庫發佈到內部儲存庫:
mvn deploy:deploy-file \
-DgroupId=com.baeldung \
-DartifactId=maven-multiple-repositories \
-Dversion=0.0.1 \
-Dpackaging=jar \
-Dfile=./target/GreeterExampleService.jar \
-DrepositoryId=internal-maven-repo \
-Durl=<url-of-the-repository-to-deploy>
在我們的deploy:deploy-file
目標中,我們指定settings.xml
檔案中定義的repositoryId
,以及deploy:deploy-file
目標所需的要部署的file
和儲存庫URL
。
如果我們需要該工件存在於其他儲存庫中,則需要為每個儲存庫重複 Maven 部署程序。
現在我們的自訂程式庫已部署,讓我們探索如何在其他專案中使用此依賴項。
3. 使用settings.xml
檔案設定儲存庫
Maven 設定檔幫助我們自訂建置配置。讓我們將設定檔定義加入到我們的settings.xml
檔中:
<profile>
<id>local-dev</id>
<repositories>
<repository>
<id>internal-maven-repo</id>
<name>Internal Repository</name>
<url>https://host/internal-maven-packages</url>
</repository>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
</profile>
在我們的內部儲存庫定義中,我們確保儲存庫 ID 與server
指令中指定的 ID 相符。儘管中央存儲庫配置是從 Super POM 繼承的,但我們將其包含在此處用於演示目的。
接下來,讓我們將新定義的設定檔新增到settings.xml
檔案中的活動設定檔清單:
<activeProfiles>
<activeProfile>local-dev</activeProfile>
</activeProfiles>
在此列表中包含設定檔會為所有建置啟動它。
讓我們為我們上傳的庫指定一個依賴項:
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>maven-multiple-repositories</artifactId>
<version>0.0.1</version>
</dependency>
接下來,讓我們執行 Maven install
目標,以便 Maven 下載我們的依賴項:
mvn install
我們的建置成功了,因為所有依賴項都是從各自的儲存庫中正確取得的。讓我們在單元測試中使用導入的庫:
@Test
public void whenGreetingInEnglish_thenAnENCodeShouldBeMadeAvailable() {
GreeterServiceExample greeterService = new GreeterServiceExample();
Greeting englishGreeting = greeterService.greetInYourLanguage("English");
assertEquals("en", englishGreeting.getLanguage().getCode());
}
我們的settings.xml
中配置倉庫資訊適合本地開發;但是,對於多個建置環境來說,它可能會變得很麻煩。讓我們探索另一種選擇。
4.透過pom.xml
檔案配置儲存庫
POM 檔案允許我們指定要使用的儲存庫,並選擇是否在建置設定檔內部或外部定義儲存庫詳細資訊。沒有必要在 Maven 建置設定檔中定義我們的儲存庫。
讓我們在 POM 檔案中的建置設定檔之外定義我們的儲存庫:
<repositories>
<repository>
<id>internal-maven-repo</id>
<name>Internal Repository</name>
<url>https://host/internal-maven-packages</url>
</repository>
<!-- Other repositories -->
</repositories>
由於我們的內部儲存庫需要身份驗證,因此最好將這些憑證保留在settings.xml 檔案的server
指令中**settings.xml
以避免將它們與原始程式碼一起分發**。我們再次確保儲存庫 ID 與settings.xml
檔案的server
指令中指定的 ID 相符。
讓我們運行一個建置:
mvn clean install
由於我們在建置設定檔之外定義了儲存庫,因此我們沒有將其包含在 Maven install
目標中。
5. 結論
在本教程中,我們探索了在 Maven 中指定多個儲存庫的兩種方法:使用settings.xml
檔案和使用pom.xml
檔案。儘管兩種方法都會產生相同的結果,但我們看到了在pom.xml
檔案中配置儲存庫詳細資訊如何更好地實現可移植性。但是,出於安全考慮(例如分發敏感資訊),最好不要將儲存庫身份驗證詳細資訊包含在pom.xml
檔案中。
與往常一樣,所有範例的原始程式碼都可以在 GitHub 上找到。