2009-10-13 28 views
7

我知道我可以使用屬性檢索一些settings.xml參數,例如${settings.localRepository}以獲取本地存儲庫的位置。如何獲取在settings.xml中定義的服務器的值,以便在我的pom.xml中使用它們?

現在想象一下,我的settings.xml包含以下服務器定義:

<servers> 
    <server> 
     <id>server-dev</id> 
     <username>devuser</username> 
     <password>devpass</password> 
    </server> 
    <server> 
     <id>server-hom</id> 
     <username>homuser</username> 
     <password>hompass</password> 
    </server> 
</servers> 

有沒有一種方法,給定一個服務器,以獲得任何參數的值的id?例如,類似${settings.servers.server.server-dev.username}的東西將返回devuser

我已經試過如下:

${settings.servers.server.server-dev.username} 
${settings.servers.server-dev.username} 
${settings.servers.server[server-dev].username} 
${settings.servers[server-dev].username} 

但他們沒有工作......


對此page,這是不可能的。然而,由於這是一個功能沒有正確記錄,我仍然有這樣的希望這樣...

回答

4

我不認爲這是可能的,並相信這將是暴露這些屬性的價值是一個糟糕的主意。

Settings Reference解釋的,在具有 settings.xml <servers>的點是不諸如 usernamepasswordpom.xml一起分發的值。因此,暴露屬性從任何地方讀取它們都會違反這個原則,並且可能是一個安全問題。

編輯:我在想這個,我說的是不對的。 AFAIK,Maven沒有公開在設置中定義的服務器的usernamepassword屬性和/或提供類似於OP描述的機制。 但是能夠從pom.xml訪問它們並不會是錯誤的。

就這麼說,正如Rich指出的那樣,Maven API允許您訪問設置中定義的服務器(請參閱org.apache.maven.settings.Settings#getServer(String serverId)),因此必須可以從Mojo(即在自定義插件中)設置屬性。

但我實際上並不確定你正在嘗試做什麼,也許使用<properties>和配置文件將是一個更好的方法。處理常見的環境屬性(但具體的值)對於配置文件來說是一個很好的用例。查看的章節11.5.1. Common Environments11.5.2 Protecting Secrets Maven:權威指南書。

+0

一般我同意,但也有使用情況生成內訪問它們,如圖所示由nexus- maven-plugin –

1

我不知道一個簡單的方法來做到這一點。但是您可以編寫一個小插件並將其綁定到早期階段,然後從插件中訪問設置值,並直接在插件中使用它們,或者將它們暴露爲屬性。

您可以看到如何通過看nexus-maven-plugin的源來讀取設置值,以及如何設置他們通過看properties-maven-plugin

0

可能性1將使用GMaven plugin。您可以輕鬆地訪問服務器的設置,如:

<source> 
    def server = settings.servers.find{ it.id.equals('server-hom') } 

,然後把它放到公共屬性

project.properties.srvuser = server.username 
</source> 

在以下幾個階段,你卡恩訪問從POM屬性像往常一樣:

${srvuser} 

可能性2將限定在settings.xml性能如所示here。它不取自服務器設置,而是取自一些基於配置文件的屬性。

無論如何我發現Maven默認應該拉入所有的服務器設置。

9

如果您使用的是Maven 3+,可以使用servers-maven-extension來實現。一旦註冊,可以使用$ {settings.servers.server來引用settings.xml/servers的內容。 <服務器ID >。 <財產>}(例如$ {settings.servers.server.server-dev.username})。

披露:我是該項目的維護者。

+0

完美!做得好! –

+0

同意。你搖滾。感謝您的工作。 –

0

如在描述:

Sonatype: Complete Reference 5.5.2

最好的辦法是:

<settings> 
    <profiles> 
     <profile> 
      <activeByDefault>true</activeByDefault> 
      <properties> 
       <environment.type>prod</environment.type> 
       <database.password>m1ss10nimp0ss1bl3</database.password> 
      </properties> 
     </profile> 
    </profiles> 
</settings> 
相關問題