更新時間:2021-12-22 09:38:11 來源:動力節點 瀏覽948次
Mavensettings.xml文件定義了以各種方式配置 Maven 執行的值。最常見的是,它用于定義本地存儲庫位置、備用遠程存儲庫服務器以及私有存儲庫的身份驗證信息。在本文中,您將學習如何向部署在 Heroku 上的 Java 應用程序添加自定義設置文件。
如果您已經有一個 Java 應用程序,您可以在本示例中使用它。否則,從Heroku 上的 Java 入門文章創建一個簡單的應用程序。
當settings.xml應用程序的根目錄中存在名為的文件時, Heroku 的 Java 支持將在編譯時自動使用它來配置 Maven。
為了演示這一點,settings.xml在 Java 項目的根目錄中添加一個文件,并將以下代碼放入其中。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>jboss-public</id>
<repositories>
<repository>
<id>jboss-public-repository</id>
<name>JBoss Public Maven Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>jboss-public</activeProfile>
</activeProfiles>
</settings>
這告訴 Maven在解析應用程序的依賴項時搜索托管在http://repository.jboss.org/的存儲庫。存儲庫必須使用 HTTP 或 HTTPS 尋址。
我們可以通過將-s選項添加到任何 Maven 任務來在本地測試設置。但首先,我們需要向項目添加一個新的依賴項。該jboss.web.servlet-api庫是一個很好的示例,因為它僅在 JBoss 存儲庫中可用。將以下元素添加到您的項目的pom.xml:
<dependency>
<groupId>jboss.web</groupId>
<artifactId>servlet-api</artifactId>
<version>2.1.0.GA</version>
</dependency>
現在運行以下命令,Maven 將下載工件。
mvn -s settings.xml dependency:list
[INFO] Scanning for projects...
...
Downloading: http://repository.jboss.org/nexus/content/groups/public/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.pom
Downloaded: http://repository.jboss.org/nexus/content/groups/public/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.pom (195 B at 0.2 KB/sec)
Downloading: http://repository.jboss.org/nexus/content/groups/public/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.jar
Downloaded: http://repository.jboss.org/nexus/content/groups/public/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.jar (84 KB at 90.8 KB/sec)
如果我們沒有使用自定義設置文件,構建就會失敗,Maven 會產生這樣的錯誤:
Downloading: http://repo.maven.apache.org/maven2/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.pom
[WARNING] The POM for jboss.web:servlet-api:jar:2.1.0.GA is missing, no dependency information available
Downloading: http://repo.maven.apache.org/maven2/jboss/web/servlet-api/2.1.0.GA/servlet-api-2.1.0.GA.jar
...
[ERROR] Failed to execute goal on project helloworld: Could not resolve dependencies for project com.example:helloworld:jar:1.0-SNAPSHOT: Could not find artifact jboss.web:servlet-api:jar:2.1.0.GA in central (http://repo.maven.apache.org/maven2) -> [Help 1]
現在將settings.xml和pom.xml更改添加到您的 Git 存儲庫并像這樣部署到 Heroku:
當 Maven 在 dyno 上運行時,我們看到的輸出與我們在本地看到的輸出相同。這是有效的,因為 Heroku 檢測settings.xml根目錄中的文件,并將-s選項添加到 Maven 命令。接下來,我們將討論如何自定義此位置。
如果您不希望該settings.xml文件位于根目錄中,或者您打算在不同的設置配置之間頻繁更改,您可能更愿意將設置文件放在自定義位置。Heroku 通過MAVEN_SETTINGS_PATHconfig 變量提供此功能。
我們可以通過將現有文件移動settings.xml到support/目錄中并像這樣重命名來演示此功能:
mkdir -p support
git mv settings.xml support/jboss-settings.xml
現在我們通過定義MAVEN_SETTINGS_PATH相對于根目錄來告訴 Heroku 設置文件所在的位置。
heroku config:set MAVEN_SETTINGS_PATH=support/jboss-settings.xml
在測試更改之前,我們增加了 servlet-api 的版本——強制 Maven 再次下載它。更改pom.xmlto version 中的依賴項2.1.1.GA。它應該是這樣的:
<dependency>
<groupId>jboss.web</groupId>
<artifactId>servlet-api</artifactId>
<version>2.1.1.GA</version>
</dependency>
現在將更改提交到 Git,然后像這樣重新部署到 Heroku:
git commit -am "moved settings file and incremented servlet-api version"
git push heroku master
Maven 將再次從 JBoss 存儲庫下載依賴項。這提供了一些靈活性,但有時在您的項目中自定義位置是不夠的。您可能希望將文件完全保留在您的代碼庫之外。
當MAVEN_SETTINGS_URL定義配置變量,Heroku的將下載的文件在指定的位置,并用它來配置Maven。在演示之前,我們必須取消設置我們在上一個示例中定義的變量,因為如果兩個變量都設置了,它將優先:
heroku config:unset MAVEN_SETTINGS_PATH
現在,我們可以使用settings.xml來自公開可用源(例如 Torquebox Application Server 代碼庫)的 。像這樣設置配置變量:
heroku config:set MAVEN_SETTINGS_URL="https://raw.githubusercontent.com/torquebox/torquebox/master/support/settings.xml"
和以前一樣,將 servlet-api 版本增加到2.1.2.GA,添加pom.xml到 Git 存儲庫,提交更改并重新部署到 Heroku。Maven 將像之前一樣從 JBoss 存儲庫下載新的工件。
JBoss 存儲庫很方便,因為它是公共的——不需要密碼即可訪問。但并非所有存儲庫都如此開放。
某些工件存儲庫需要用戶名和密碼才能訪問。很多時候,存儲庫是托管內部工件的私有服務器。在這種情況下,必須在 中提供訪問存儲庫的憑據,settings.xml如果將文件簽入 Git 存儲庫,這可能會出現問題。
幸運的是,Maven 設置文件可以檢測環境變量。表單中的任何標記${env.ENV_VAR}(其中ENV_VAR是變量的名稱)都將解析為關聯環境變量的值。因此,我們可以將私有 Maven 存儲庫的密碼定義為 Heroku 配置變量,如下所示:
heroku config:set MAVEN_REPO_PASSWORD="deployment123"
然后,我們可以用我們的變量settings.xml通過創建一個文件<server>相匹配的元素<id>中的<repository>元素中<activeProfile>。
<servers>
<server>
<id>my-private-repo</id>
<username>deployment</username>
<password>${env.MAVEN_REPO_PASSWORD}</password>
</server>
</servers>
為了演示這一點,您將需要一個私有的 Maven存儲庫。您可以通過下載Sonatype Nexus并按照保護存儲庫的說明來創建存儲庫。或者您可以使用JFrog Artifactory的托管版本。
在任何一種情況下,都可以使用私有存儲庫來發布內部工件并將它們包含在您的 Heroku 應用程序中。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習