AutoConfig工具使用指南


第 13 章 AutoConfig工具使用指南

13.1. 需求分析

在一個應用中,我們總是會遇到一些參數,例如:

  • 數據庫服務器IP地址、端口、用戶名;

  • 用來保存上傳資料的目錄。

  • 一些參數,諸如是否打開cache、加密所用的密鑰名稱等等。

這些參數有一個共性,那就是:它們和應用的邏輯無關,只和當前環境、當前系統用戶相關。以下場景很常見:

  • 在開發、測試、發布階段,使用不同的數據庫服務器;

  • 在開發階段,使用Windows的A開發者將用戶上傳的文件存放在d:\my_upload目錄中,而使用Linux的B開發者將同樣的文件存放在/home/myname/my_upload目錄中。

  • 在開發階段設置cache=off,在生產環境中設置cache=on

很明顯,這些參數不適合被“硬編碼”在配置文件或代碼中。因為每一個從源碼庫中取得它們的人,都有可能需要修改它們,使之與自己的環境相匹配。

13.1.1. 解決方案

13.1.1.1. 運行時替換的placeholders

很多框架支持在運行時刻替換配置文件中的placeholder占位符。例如, Webx/Spring就有這個功能。

例 13.1. 在Webx中定義placeholders

<services:property-placeholder />

<services:webx-configuration>
    <services:productionMode>${productionMode:true}</services:productionMode>
</services:webx-configuration>

在上面這個例子中,你可以在啟動應用時,加上JVM參數:“-DproductionMode=false|true”來告訴系統用哪一種模式來工作。如果不指定,則取默認值“true”。

運行時替換placeholder是一種非常實用的技術,它有如下優缺點:

表 13.1. 運行時替換placeholders的優缺點

優點 缺點
  • 配置文件是靜態的、不變的。即使采用不同的參數值,你也不需要更改配置文件本身。

  • 你可以隨時改變參數的值,只需要啟動時指定不同的JVM參數、或指定不同的properties文件即可。

  • 這種配置對於應用程序各組件是透明的 —— 應用程序不需要做特別的編程,即可使用placeholders。

  • 並非所有框架都支持這種技術。

  • 支持該技術的框架各有不同的用法。例如:Spring和Log4j都支持placeholder替換,然則它們的做法是完全不同的。Spring通過PropertyPlaceholderConfigurer類來配置,而Log4j則需要在DomConfigurator中把參數傳進去。

13.1.1.2. 中心配置服務器(Config Server)

這也是一種運行時技術。它可以在運行時刻,將應用所需的參數推送到應用中。

它有如下優缺點:

表 13.2. 中心配置服務器的優缺點

優點 缺點
  • 它可以集中管理所有應用的配置,避免可能的錯誤;

  • 它可以在運行時改變參數的值,並推送到所有應用中。參數的更改可立即生效。

  • 需要一套獨立的服務器系統。性能、可用性(availability)都是必須考慮的問題。

  • 對應用不是透明的,有一定的侵入性。應用程序必須主動來配合該技術。因此,該技術不可能適用於所有情況,特別對於第三方提供的代碼,很難使用該技術。

  • 為了連接到中心配置服務器,你仍然需要配置適當的IP、端口等參數。你需要用其它技術來處理這些參數(例如placeholders)。

13.1.1.3. Maven Filtering機制

Maven提供了一種過濾機制,可以在資源文件被復制到目標目錄的同時,替換其中的placeholders。

例 13.2. 配置Maven Filtering機制

假設你的項目目錄結構如下:

web-project
 │  pom.xml
 │
 └─src
     └─main
         ├─java
         ├─resources
         └─webapp
             └─WEB-INF
                     web.xml

pom.xml中這樣寫:

<build>
    <filters>
        <filter>${user.home}/antx.properties</filter> 
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>  <includes> <include>**.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**.xml</exclude> </excludes> </resource> </resources> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>src/main/webapp</directory>  <includes> <include>WEB-INF/**.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/webapp</directory> <excludes> <include>WEB-INF/**.xml</include> </excludes> </resource> </webResources> </configuration> </plugin> </plugins> </build>

這段pom定義告訴maven:

用指定的properties文件(${user.home}/antx.properties)中的值,替換文件中的placeholders。

過濾src/main/resources/目錄中的所有xml文件,替換其中的placeholders。

過濾src/webapp/WEB-INF/目錄中的所有xml文件,替換其中的placeholders。

如果上述xml文件中,包含“${xxx.yyy.zzz}”這樣的placeholders,將被替換成properties文件中的相應值。

和運行時替換placeholders方案相比,Maven Filtering是一個build時進行的過程。它的優缺點是:

表 13.3. Maven Filtering機制的優缺點

優點 缺點
  • Maven filtering機制和應用所采用的技術、框架完全無關,對應用完全透明,通用性好。

  • Maven filtering機制在build時刻永久性改變被過濾的配置文件的內容,build結束以后無法更改。這將導致一個問題:如果要改變配置文件的參數,必須獲取源碼並重新build。

  • 缺少驗證機制。當某個placeholder拼寫錯誤;當properties中的值寫錯;當某配置文件中新增了一個placeholder,而你的properties文件中沒有對應的值時,maven不會提醒你。而這些錯誤往往被拖延到應用程序運行時才會被報告出來。

13.1.1.4. AutoConfig機制

AutoConfig是一種類似於Maven Filtering的build時刻的工具。這意味着該機制與應用所采用的技術、框架完全無關,對應用完全透明,具有良好的通用性。同時,AutoConfig與運行時的配置技術並不沖突。它可以和運行時替換的placeholders以及中心配置服務器完美並存,互為補充。

AutoConfig書寫placeholder的方法和Maven Filtering機制完全相同。換言之,Maven Filtering的配置文件模板(前例中的/WEB-INF/**.xml)可以不加修改地用在AutoConfig中。

然而,autoconfig成功克服了Maven Filtering的主要問題。

表 13.4. Maven Filtering和AutoConfig的比較

問題 Maven Filtering AutoConfig
如何修改配置文件的參數? Maven Filtering必須獲得源碼並重新build; 而AutoConfig不需要提取源碼,也不需要重新build,即可改變目標文件中所有配置文件中placeholders的值。
如何確保placeholder替換的正確性? Maven Filtering不能驗證placeholder值的缺失和錯誤; 但AutoConfig可以對placeholder及其值進行檢查。

接下來,我們將將詳細介紹AutoConfig的使用方法。

13.2. AutoConfig的設計

很多人會把AutoConfig看作Maven Filtering機制的簡單替代品。事實上,這兩者的設計初衷有很大的區別。

13.2.1. 角色與職責

為了把事情說清楚,我們必須要定義兩種角色:開發者(Developer)部署者(Deployer)

表 13.5. 角色和職責

角色名稱 職責
開發者
  • 定義應用所需要的properties,及其限定條件;

  • 提供包含placeholders的配置文件模板。

部署者
  • 根據所定義的properties,提供符合限定條件的屬性值。

  • 調用AutoConfig來生成目標配置文件。

例如,一個寵物店(petstore)的WEB應用中需要指定一個用來上傳文件的目錄。於是,

表 13.6. Petstore應用中的角色和職責

開發者 部署者

開發者定義了一個property:petstore.upload_dir

限定條件為:“合法的文件系統的目錄名”。

部署者取得petstore的二進制發布包,通過AutoConfig了解到,應用需要一個名為petstore.upload_dir目錄名。

部署者便指定一個目錄給petstore,該目錄名的具體值可能因不同的系統而異。

AutoConfig會檢驗該值是否符合限定條件(是否為合法目錄名),如果檢驗通過,就生成配置文件,並將其中的${petstore.upload_dir}替換成該目錄名。

需要注意的是,一個“物理人”所對應的“角色”不是一成不變的。例如:某“開發者”需要試運行應用,此時,他就變成“部署者”。

13.2.2. 分享二進制目標文件

假設現在有兩個team要互相合作,team A的開發者創建了project A,而team B的開發者創建了project B。假定project B依賴於project A。如果我們利用maven這樣的build工具,那么最顯而易見的合作方案是這樣的:

  • Team A發布一個project A的版本到maven repository中。

  • Team B從maven repository中取得project A的二進制目標文件。

這種方案有很多好處,

  • 每個team都可以獨立控制自己發布版本的節奏;

  • Team之間的關系較松散,唯一的關系紐帶就是maven repository。

  • Team之間不需要共享源碼。

然而,假如project A中有一些配置文件中的placeholders需要被替換,如果使用Maven Filtering機制,就會出現問題。因為Maven Filtering只能在project A被build時替換其中的placeholders,一旦project A被發布到repository中,team B的人將無法修改任何project A中的配置參數。除非team B的人取得project A的源碼,並重新build。這將帶來很大的負擔。

AutoConfig解決了這個問題。因為當team B的人從maven repository中取得project A的二進制包時,仍然有機會修改其配置文件里的placeholders。Team B的人甚至不需要了解project A里配置文件的任何細節,AutoConfig會自動發現所有的properties定義,並提示編輯。

13.2.3. 部署二進制目標文件

部署應用的人(即部署者、deployer)也從中受益。因為deployer不再需要親手去build源代碼,而是從maven repository中取得二進制目標文件即可。

多團隊多角色的合作

圖 13.1. 多團隊多角色的合作

從這個意義上講,AutoConfig不應當被看成是一個build時的簡單配置工具,而是一個“軟件安裝工具”。如同我們安裝一個Windows軟件 —— 我們當然不需要從源碼開始build它們,而是執行其安裝程序,設定一些參數諸如安裝目錄、文檔目錄、可選項等。安裝程序就會自動把軟件設置好,確保軟件可正確運行於當前的Windows環境中。

13.2.4. AutoConfig特性列表

為了滿足前面所說的目的,我們將AutoConfig設計成下面的樣子:

表 13.7. AutoConfig Features

名稱 描述
兩種用法
  • 既可獨立使用(支持Windows和Unix-like平台)。

  • 也可以作為maven插件來使用。

對目標文件而不是源文件進行配置
  • 可對同一個目標文件反復配置。

  • 配置時不依賴於項目源文件。

  • 支持嵌套包文件,例如:ear包含war,war又包含jar。

  • 高性能,特別對於嵌套的包文件。

驗證和編輯properties
  • 自動發現保存於war包、jar包、ear包中的properties定義。

  • 驗證properties的正確性。

  • 交互式編輯properties。

  • 當配置文件中出現未定義的placeholders時,提示報錯。

13.3. AutoConfig的使用 —— 開發者指南

13.3.1. 建立AutoConfig目錄結構

和Maven Filtering不同的是,AutoConfig是針對目標文件的配置工具。因此AutoConfig關心的目錄結構是目標文件的目錄結構。不同的build工具,創建同一目標目錄結構所需要的源文件的目錄結構會各有不同。本文僅以maven標准目錄結構為例,來說明源文件的目錄結構編排。

13.3.1.1. WAR包的目錄結構

這里所說的war包,可以是一個以zip方式打包的文件,也可以是一個展開的目錄。下面以maven標准目錄為例,說明項目源文件和目標文件的目錄結構的對比:

例 13.3. WAR包的源文件和目標文件目錄結構

war-project(源目錄結構)               -> war-project.war(目標目錄結構)
 │  pom.xml
 │
 └─src
     └─main
         ├─java
         ├─resources                    -> /WEB-INF/classes
         │      file1.xml                      file1.xml
         │      file2.xml                      file2.xml
         │
         └─webapp                       -> /
             ├─META-INF                 -> /META-INF │ └─autoconf -> /META-INF/autoconf auto-config.xml auto-config.xml  │ └─WEB-INF -> /WEB-INF web.xml web.xml file3.xml file3.xml

/META-INF/autoconf目錄用來存放AutoConfig的描述文件,以及可選的模板文件。

auto-config.xml是用來指導AutoConfig行為的關鍵描述文件。

創建war包的AutoConfig機制,關鍵在於創建war目標文件中的/META-INF/autoconf/auto-config.xml描述文件。該描述文件對應的maven項目源文件為:/src/main/webapp/META-INF/autoconf/auto-config.xml

13.3.1.2. JAR包的目錄結構

這里所說的jar包,可以是一個以zip方式打包的文件,也可以是一個展開的目錄。下面以maven標准目錄為例,說明項目源文件和目標文件的目錄結構的對比:

例 13.4. JAR包的源文件和目標文件目錄結構

jar-project(源目錄結構)               -> jar-project.jar(目標目錄結構)
 │  pom.xml
 │
 └─src
     └─main
         ├─java
         └─resources                    -> /
             │  file1.xml                      file1.xml
             │  file2.xml                      file2.xml
             │
             └─META-INF                 -> /META-INF └─autoconf -> /META-INF/autoconf  auto-config.xml auto-config.xml 

/META-INF/autoconf目錄用來存放AutoConfig的描述文件,以及可選的模板文件。

auto-config.xml是用來指導AutoConfig行為的關鍵描述文件。

創建jar包的AutoConfig機制,關鍵在於創建jar目標文件中的/META-INF/autoconf/auto-config.xml描述文件。該描述文件對應的maven項目源文件為:/src/main/resources/META-INF/autoconf/auto-config.xml

13.3.1.3. 普通目錄

AutoConfig也支持對普通文件目錄進行配置。

例 13.5. 對普通的目錄執行AutoConfig

directory
 │  file1.xml
 │  file2.xml
 │
 └─conf  auto-config.xml 

默認情況下,AutoConfig在/conf目錄中尋找AutoConfig的描述文件,以及可選的模板文件。

auto-config.xml是用來指導AutoConfig行為的關鍵描述文件。

13.3.2. 建立auto-config.xml描述文件

AutoConfig系統的核心就是auto-config.xml描述文件。該描述文件中包含兩部分內容:

  1. 定義properties:properties的名稱、描述、默認值、約束條件等信息;

  2. 指定包含placeholders的模板文件。

下面是auto-config.xml文件的樣子:(以petstore應用為例)

例 13.6. AutoConfig描述文件示例

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <group>

        <property name="petstore.work" description="應用程序的工作目錄" />  <property name="petstore.loggingRoot" defaultValue="${petstore.work}/logs" description="日志文件目錄" />  <property name="petstore.upload" defaultValue="${petstore.work}/upload" description="上傳文件的目錄" />  <property name="petstore.loggingLevel" defaultValue="warn" description="日志文件級別">  <validator name="choice" choice="trace, debug, info, warn, error" />  </property> </group> <script> <generate template="WEB-INF/web.xml" />  <generate template="WEB-INF/common/resources.xml" /> </script> </config>

   

定義properties

定義property的驗證規則(可選)

生成配置文件的指令。

13.3.2.1. 定義properties

定義一個property的完整格式如下:

例 13.7. 定義一個property

<property
    name="..." [defaultValue="..."] [description="..."] [required="true|false"] > <validator name="..." /> <validator name="..." /> ... </property>

可用的property參數包括:

表 13.8. 定義property時可用的參數

參數名 說明
name Property名稱。
defaultValue(可選) 默認值。默認值中可包含對其它property的引用,如${petstore.work}/logs
description(可選) 對字段的描述,這個描述會顯示給deployer,這對他理解該property非常重要。
required(可選) 是否“必填”,默認為true。如果deployer未提供必填項的值,就會報錯。

13.3.2.2. 定義property的驗證規則

目前,有以下幾種驗證器:

表 13.9. 可用的property驗證規則

驗證規則 說明
<validator name="boolean" />

Property值必須為truefalse

<validator name="choice" choice="trace, debug, info, warn, error" />

Property值必須為choice所定義的值之一。

<validator name="email" />

Property值必須為合法的email格式。

<validator name="fileExist" [file="WEB-INF/web.xml"] />

Property值必須為某個存在的文件或目錄。

如果指定了file,那就意味着property值所指的目錄下,必須存在file所指的文件或子目錄。

<validator name="hostExist" />

Property值必須為合法的IP地址,或者可以解析得到的域名。

<validator name="keyword" />

Property值必須為字母、數字、下划線的組合。

<validator name="number" />

Property值必須為數字的組合。

<validator name="regexp" regexp="..." [mode="exact|prefix|contain"] />

Property值必須符合regexp所指的正則表達式。

其中,mode為匹配的方法:

  • 完全匹配exact

  • 前綴匹配prefix

  • 包含contain

如未指定mode,默認mode為contain。

<validator name="url" [checkHostExist="false"] [protocols="http, https"] [endsWithSlash="true"] />

Property值必須是合法URL。

假如指定了checkHostExist=true,那么還會檢查域名或IP的正確性;

假如指定了protocols,那么URL的協議必須為其中之一;

假如指定了endsWithSlash=true,那么URL必須以/結尾。

13.3.2.3. 生成配置文件的指令

描述文件中,每個<generate>標簽指定了一個包含placeholders的配置文件模板,具體格式為:

例 13.8. 生成配置文件的指令

<generate
    template="..." [destfile="..."] [charset="..."] [outputCharset="..."] >

下面是參數的說明:

表 13.10. 生成配置文件的指令參數

參數名 說明
template

需要配置的模板名。

模板名為相對路徑,相對於當前jar/war/ear包的根目錄。

destfile(可選)

目標文件。

如不指定,表示目標文件和模板文件相同。

charset(可選)

模板的字符集編碼。

XML文件不需要指定charset,因為AutoConfig可以自動取得XML文件的字符集編碼;

對其它文件必須指定charset。

outputCharset(可選)

目標文件的輸出字符集編碼。

如不指定,表示和模板charset相同。

13.3.3. 建立模板文件

13.3.3.1. 模板文件的位置

定義完auto-config.xml描述文件以后,就可以創建模板了。模板放在哪里呢?舉例說明。

例 13.9. 模板文件的位置

假設在一個典型的WEB應用中,你的auto-config.xml中包含指定了如下模板:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <group>
        ...
    </group>
    <script>
        <generate template="WEB-INF/classes/file1.xml" /> <generate template="WEB-INF/classes/file2.xml" /> <generate template="WEB-INF/file3.xml" /> </script> </config>

那么,你可以把file1.xmlfile2.xmlfile3.xml放在下面的位置:

war-project(源目錄結構)               -> war-project.war(目標目錄結構)
 │  pom.xml
 │
 └─src
     └─main
         ├─java
         ├─resources                    -> /WEB-INF/classesfile1.xml file1.xml - 建議放在這里file2.xml file2.xml - 建議放在這里 │ └─webapp ├─META-INF │ └─autoconf │ │ auto-config.xml │ │ │ └─WEB-INF -> /WEB-INF │ │ file3.xml file3.xml - 也可以放在這里 │ │ │ └─classes -> /WEB-INF/classes │ file1.xml file1.xml - 也可以放在這里 │ file2.xml file2.xml - 也可以放在這里 │ └─WEB-INF -> /WEB-INF file3.xml file3.xml - 建議放在這里

AutoConfig的尋找模板的邏輯是:

  • 如果在auto-config.xml所在的目錄下發現模板文件,就使用它;

  • 否則在包的根目錄中查找模板文件;如果兩處均未找到,則報錯。

13.3.3.2. 模板的寫法

書寫模板是很簡單的事,你只要:

  • 把需要配置的點替換成placeholder:“${property.name}”。當然,你得確保property.name被定義在auto-config.xml中。

  • 假如模板中包含不希望被替換的運行時的placeholder“${...}”,需要更改成“${D}{...}” 。

例 13.10. 模板示例

...
<context-param>
    <param-name>loggingRoot</param-name>
    <param-value>${petstore.loggingRoot}</param-value>
</context-param>
<context-param>
    <param-name>loggingLevel</param-name>
    <param-value>${petstore.loggingLevel}</param-value> </context-param> ... ${D}{runtime.placeholder}

此外,AutoConfig模板其實是由Velocity模板引擎來渲染的。因此,所有的placeholder必須能夠通過velocity的語法。

例 13.11. 使用不符合velocity語法的placeholders

例如,下面的placeholder被velocity看作非法:

${my.property.2}

解決的辦法是,改寫成如下樣式:

${my_property_2}

13.4. AutoConfig的使用 —— 部署者指南

部署者有兩種方法可以使用AutoConfig:

  • 在命令行上直接運行。

  • 在maven中調用AutoConfig plugin。

13.4.1. 在命令行中使用AutoConfig

13.4.1.1. 取得可執行文件

AutoConfig提供了Windows以及Unix-like(Linux、Mac OS等)等平台上均可使用的native可執行程序。可執行程序文件被發布在Maven repository中。

如果你已經配置好了maven,那么可以讓maven來幫你下載目標文件。

例 13.12. 讓maven幫忙下載AutoConfig可執行文件

請創建一個臨時文件:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>com.alibaba.citrus.tool</groupId> <artifactId>antx-parent</artifactId> <version>1.2</version>  </parent> <modelVersion>4.0.0</modelVersion> <artifactId>temp</artifactId> </project>

文件中的parent pom的版本號(1.2)決定了你要取得的AutoConfig的版本號。

然后在命令行上執行如下命令:

mvn dependency:copy

這樣就取得了兩個文件:

你也可以直接去maven repository中手工下載以上兩個包:

取得壓縮包以后,可以用下面的命令來展開並安裝工具。

表 13.11. 展開並安裝工具

Unix-like系統 Windows系統
tar zxvf autoconfig-1.2.tgz
tar zxvf autoexpand-1.2.tgz
cp autoconfig /usr/local/bin
cp autoexpand /usr/local/bin
tar zxvf autoconfig-1.2.tgz
tar zxvf autoexpand-1.2.tgz
copy autoconfig.exe c:\windows\system32
copy autoexpand.exe c:\windows\system32

13.4.1.2. 執行AutoConfig命令

取得可執行文件以后,就可以試用一下:在命令行上輸入autoconfig。不帶參數的autoconfig命令會顯示出如下幫助信息。

例 13.13. AutoConfig的幫助信息

$ autoconfig
Detected system charset encoding: UTF-8
If your can't read the following text, specify correct one like this: 
  autoconfig -c mycharset

使用方法:autoconfig [可選參數] [目錄名|包文件名]
                
可選參數:
 -c,--charset                輸入/輸出編碼字符集
 -d,--include-descriptors
                             包含哪些配置描述文件,例如:conf/auto-config.xml,可使用*、**、?通配符,如有多項,用逗號分隔
 -D,--exclude-descriptors    排除哪些配置描述文件,可使用*、**、?通配符,如有多項,用逗號分隔
 -g,--gui                    圖形用戶界面(交互模式)
 -h,--help                   顯示幫助信息
 -i,--interactive            交互模式:auto|on|off,默認為auto,無參數表示on
 -I,--non-interactive        非交互模式,相當於--interactive=off
 -n,--shared-props-name      共享的屬性文件的名稱
 -o,--output                 輸出文件名或目錄名
 -P,--exclude-packages       排除哪些打包文件,可使用*、**、?通配符,如有多項,用逗號分隔
 -p,--include-packages
                             包含哪些打包文件,例如:target/*.war,可使用*、**、?通配符,如有多項,用逗號分隔
 -s,--shared-props           共享的屬性文件URL列表,以逗號分隔
 -T,--type                   文件類型,例如:war, jar, ear等
 -t,--text                   文本用戶界面(交互模式)
 -u,--userprop               用戶屬性文件
 -v,--verbose                顯示更多信息

總耗費時間:546毫秒

最簡單的AutoConfig命令如下:

例 13.14. 最簡單的AutoConfig命令

autoconfig petstore.war

無論petstore.war是一個zip包還是目錄,AutoConfig都會正確地生成其中的配置文件。

13.4.2. 在maven中使用AutoConfig

AutoConfig也可以通過maven plugin來執行。

這種方式使用方式,方便了開發者試運行並測試應用程序。開發者可以在build項目的同時,把AutoConfig也配置好。然而對於非開發的應用測試人員、發布應用的系統管理員來說,最好的方法是使用獨立可執行的AutoConfig來配置應用的二進制目標文件。

為了使用maven插件,你需要修改項目的pom.xml來設定它。請注意,一般來說,不要在parent pom.xml中設定AutoConfig,因為這個設置會作用在每個子項目上,導致不必要的AutoConfig執行。只在生成最終目標文件的子項目pom.xml中設定AutoConfig就可以了。例如,對於一個web項目,你可以在生成war包的子項目上設置AutoConfig plugin。

例 13.15. 在pom.xml中設定AutoConfig plugin

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ... <properties> ... <!-- 定義autoconfig的版本,建議將此行寫在parent pom.xml中。 --> <autoconfig-plugin-version>1.2</autoconfig-plugin-version> </properties> ... <build> <plugins> <plugin> <groupId>com.alibaba.citrus.tool</groupId> <artifactId>autoconfig-maven-plugin</artifactId> <version>${autoconfig-plugin-version}</version> <configuration> <!-- 要進行AutoConfig的目標文件,默認為${project.artifact.file}。 <dest>${project.artifact.file}</dest> --> <!-- 配置后,是否展開目標文件,默認為false,不展開。 <exploding>true</exploding> --> <!-- 展開到指定目錄,默認為${project.build.directory}/${project.build.finalName}。 <explodedDirectory> ${project.build.directory}/${project.build.finalName} </explodedDirectory> --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>autoconfig</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

這樣,每次執行mvn package或者mvn install時,都會激活AutoConfig,對package目標文件進行配置。

想要避免AutoConfig,只需要一個額外的命令行參數:

例 13.16. 避免執行AutoConfig

mvn install –Dautoconfig.skip

13.4.3. 運行並觀察AutoConfig的結果

第一次執行AutoConfig,無論通過何種方式(獨立命令行或maven插件),AutoConfig都會提示你修改user properties文件,以提供所需要的properties值。AutoConfig提供了一套基於文本的交互式界面來編輯這些properties。

例 13.17. 交互式編輯properties

╭───────────────────────┈┈┈┈
│
│ 您的配置文件需要被更新:
│
│ file:/.../antx.properties
│
│ 這個文件包括了您個人的特殊設置,
│ 包括服務器端口、您的郵件地址等內容。
│
└───────┈┈┈┈┈┈┈┈┈┈┈

 如果不更新此文件,可能會導致配置文件的內容不完整。
 您需要現在更新此文件嗎? [Yes][No] y

當你通過交互式界面填寫了所有properties的值,並通過了AutoConfig的驗證以后,AutoConfig就開始生成配置文件:

即將保存到文件"file:/.../antx.properties"中, 確定? [Yes][No] y

╭───────────────────────┈┈┈┈
│ 保存文件 file:/.../antx.properties...
│┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
│petstore.loggingLevel  = warn
│petstore.loggingRoot   = ${petstore.work}/logs
│petstore.upload        = ${petstore.work}/upload
│petstore.work          = /tmp
└───────┈┈┈┈┈┈┈┈┈┈┈
 已保存至文件: file:/.../antx.properties
Loading file:/.../antx.properties
<jar:file:/.../Work/my/apps/petstore-webx3/target/petstore.war!/>
    Generating WEB-INF/web.xml [UTF-8] => WEB-INF/web.xml [UTF-8]

<jar:file:/.../Work/my/apps/petstore-webx3/target/petstore.war!/>
    Generating WEB-INF/common/resources.xml [UTF-8] => WEB-INF/common/resources.xml [UTF-8] <jar:file:/.../Work/my/apps/petstore-webx3/target/petstore.war!/> Generating log file: META-INF/autoconf/auto-config.xml.log Expanding: /.../Work/my/apps/petstore-webx3/target/petstore.war To: /.../Work/my/apps/petstore-webx3/target/petstore done.

假如發現模板中某個placeholder,並未在auto-config.xml中定義,就會出現以下錯誤:

ERROR - Undefined placeholders found in template:
- Template:   META-INF/autoconf/WEB-INF/web.xml
- Descriptor: META-INF/autoconf/auto-config.xml
- Base URL:   file:/.../Work/my/apps/petstore-webx3/target/petstore/
---------------------------------------------------------------
-> petstore.loggingRoot
---------------------------------------------------------------

出現錯誤以后,Maven會報錯,並停止build過程。假如你不希望maven停止,可以用下面的命令來執行maven:

例 13.18. 避免maven因為placeholder未定義而停止

mvn ... –Dautoconfig.strict=false

AutoConfig會生成一個日志文件,就在auto-config.xml所在的目錄下,名字為:auto-config.xml.log

例 13.19. AutoConfig所生成的日志文件

Last Configured at: Fri Jun 18 13:54:22 CST 2010

Base URL: file:/.../Work/my/apps/petstore-webx3/target/petstore/
Descriptor: META-INF/autoconf/auto-config.xml

Generating META-INF/autoconf/WEB-INF/web.xml [UTF-8] => WEB-INF/web.xml [UTF-8]
Generating META-INF/autoconf/WEB-INF/common/resources.xml [UTF-8] => WEB-INF/common/resources.xml [UTF-8]

最后,讓我們查看一下AutoConfig所生成的文件,其中所有的placeholders應當被替換成你所提供的值了。

例 13.20. AutoConfig生成的結果

...
<context-param>
    <param-name>loggingRoot</param-name>
    <param-value>/tmp/logs</param-value>
</context-param>
<context-param>
    <param-name>loggingLevel</param-name>
    <param-value>warn</param-value> </context-param> ... ${runtime.placeholder}

13.4.4. 共享properties文件

當需要配置的內容越來越多時,即使使用AutoConfig這樣的機制,也會變得不勝其煩。

假如你的項目包含了好幾個模塊,而你只負責其中的一個模塊。一般來說,你對其它模塊的配置是什么並不清楚,事實上你也懶得去關心。但是你為了運行這個項目,你不得不去配置這些模塊。假如模塊A就是一個你不想關心的模塊,但為了運行它,你需要告訴模塊A一些參數:數據庫連接的參數、域名、端口、文件目錄、搜索引擎……可你並不清楚這些參數應該取什么值。

好在AutoConfig提供了一個共享properties文件的方法。

13.4.4.1. 共享的properties文件

你可以創建一系列文件:module-a-db.properitesmodule-a-searchengine.properties等等。每個文件中都包含了某個運行環境中的關於module A模塊的配置參數。

現在,你可以不關心module A了!你只要使用下面的命令:

例 13.21. 指定共享的properties文件

autoconfig -s module-a-db.properties,module-a-searchengine.properties ……

-s參數代表“共享的properties文件”。

同時,你的antx.properties也被簡化了,因為這里只會保存你定義的配置項,而不會包含共享的配置項。

13.4.4.2. 共享整個目錄

假如共享的文件很多的話,AutoConfig還有一個貼心的功能,你可以把這些文件按目錄來組織:

例 13.22. 按目錄組織要被共享的properties文件

shared-properties/
 ├─test/                                 // 測試環境的共享配置
 │    module-a-db.properties
 │    module-a-searchengine.properties
 │    module-b.properties
 └─prod/ // 生產環境的共享配置 module-a-db.properties module-a-searchengine.properties module-b.properties

然后,你可以直接在AutoConfig中引用目錄:

例 13.23. 共享指定目錄中的所有properties文件

autoconfig -s shared-propertes/test/ ……

AutoConfig就會為你裝載這個目錄下的所有共享配置文件。(注意,目錄必須以斜杠“/”結尾

13.4.4.3. 將共享目錄放在http、https或ssh服務器上

AutoConfig還支持從http、https或ssh服務器上取得共享配置文件,只需要將前面例子中的文件名改成http或ssh的URI就可以了:

例 13.24. 共享遠程服務器上的properties文件或目錄

autoconfig -s http://share.alibaba.com/shared-propertes/test/ …… autoconfig -s http://myname@share.alibaba.com/shared-propertes/test/ …… autoconfig -s https://share.alibaba.com/shared-propertes/test/ …… autoconfig -s https://myname@share.alibaba.com/shared-propertes/test/ …… autoconfig -s ssh://myname@share.alibaba.com/shared-propertes/test/ ……

共享遠程http服務器上的properties文件。

共享遠程http服務器上的properties文件,指定登錄用戶名。

共享遠程https服務器上的properties文件。

共享遠程https服務器上的properties文件,指定登錄用戶名。

共享遠程ssh服務器上的properties文件,必須指定用戶名。

由於Subversion、Git服務器是支持HTTP/HTTPS協議的,因此將properties文件存放在Subversion或Git服務器上,也是一個極好的辦法。由於采用了Subversion或Git,properties文件的版本管理問題也被一舉解決了。

需要注意的是,訪問http和ssh有可能需要驗證用戶和密碼。當需要驗證時,AutoConfig會提示你輸入用戶名和密碼。輸入以后,密碼將被保存在$HOME/passwd.autoconfig文件中,以后就不需要重復提問了。

13.4.4.4. 在多種配置項中切換

當你使用前文所述的autoconfig –s命令來生成antx.properties文件時,你會發現antx.properties中增加了幾行特別的內容:

例 13.25. 包含共享文件、目錄信息的antx.properties文件

antx.properties.default  = http://share.alibaba.com/shared-propertes/test/

如果你在-s參數中指定了多項共享properties文件或目錄,那么antx.properties中將會這樣:

antx.properties.default.1  = http://share.alibaba.com/shared-propertes/test/
antx.properties.default.2 = file:/shared-properties/test/my-1.properites antx.properties.default.3 = file:/shared-properties/test/my-2.properites

事實上,AutoConfig還支持多組共享配置,請試用下面的命令:

例 13.26. 使用多組共享配置

autoconfig -s http://share.alibaba.com/shared-propertes/test/ -n test ……

為當前共享配置定義一個名字,以后可以用這個名字來簡化命令。

這時,antx.properties就會是這個樣子:

antx.properties = test
antx.properties.test = http://share.alibaba.com/shared-propertes/test/

再執行:

autoconfig -s http://share.alibaba.com/shared-propertes/prod/ -n prod ……

antx.properties就會變成這個樣子:

antx.properties = prod
antx.properties.test = http://share.alibaba.com/shared-propertes/test/
antx.properties.prod = http://share.alibaba.com/shared-propertes/prod/

以后再執行,就不需要再指定-s參數了,只需用-n參數選擇一組共享properties文件即可。例如:

autoconfig -n prod …… // 使用prod生產環境的參數 autoconfig -n test …… // 使用test測試環境的參數 autoconfig  …… // 不指定,則使用最近一次所選擇的共享文件

13.4.5. AutoConfig常用命令

下面羅列了AutoConfig的常用的命令及參數:

13.4.5.1. 指定交互式界面的charset

一般不需要特別指定charset,除非AutoConfig自動識別系統編碼出錯,導致顯示亂碼。

運行AutoConfig獨立可執行程序
autoconfig ... -c GBK
運行AutoConfig maven插件
mvn ... -Dautoconfig.charset=GBK

13.4.5.2. 指定交互模式

默認情況下,交互模式為自動(auto)。僅當user properties中的值不滿足auto-config.xml中的定義時,才會交互式地引導用戶提供properties值。

但你可以強制打開交互模式:

運行AutoConfig獨立可執行程序
autoconfig ... –i
autoconfig ... –i on
運行AutoConfig maven插件
mvn ... -Dautoconfig.interactive
mvn ...  -Dautoconfig.interactive=true

或強制關閉交互模式:

運行AutoConfig獨立可執行程序
autoconfig ... –I
autoconfig ... –i off
運行AutoConfig maven插件
mvn ...  -Dautoconfig.interactive=false

13.4.5.3. 指定user properties

默認情況下,AutoConfig會按下列順序查找user properties:

  1. 當前目錄/antx.properties

  2. 當前用戶HOME目錄/antx.properties

但你可以指定一個自己的properties文件,用下面的命令:

運行AutoConfig獨立可執行程序
autoconfig ... –u my.props
運行AutoConfig maven插件
mvn ... -Dautoconfig.userProperties=my.props

13.4.5.4. 顯示詳細的信息

默認情況下,AutoConfig只輸出重要的信息,但有時你想了解更多內部的情況,只需要用下面的命令:

運行AutoConfig獨立可執行程序
autoconfig ... –v
運行AutoConfig maven插件 不適用

13.4.5.5. 指定輸出文件

默認情況下,AutoConfig所生成的配置文件以及日志信息會直接輸出到當前包文件或目錄中。例如以下命令會改變petstore.war的內容:

autoconfig petstore.war

但你可以指定另一個輸出文件或目錄,這樣,原來的文件或目錄就不會被修改:

運行AutoConfig獨立可執行程序
autoconfig petstore.war –o petstore-configured.war
運行AutoConfig maven插件 不適用

13.4.5.6. 避免執行AutoConfig

將AutoConfig和maven package phase綁定以后,每次build都會激活AutoConfig。假如你想跳過這一步,只需要下面的命令:

運行AutoConfig獨立可執行程序 不適用
運行AutoConfig maven插件
mvn ... -Dautoconfig.skip

13.4.5.7. 避免中斷maven build

默認情況下,假如發現有未定義的placeholders,AutoConfig會報錯並中止maven的執行。假如你不想中斷maven build,可以這樣做:

運行AutoConfig獨立可執行程序 不適用
運行AutoConfig maven插件
mvn ... -Dautoconfig.strict=false

13.5. 本章總結

AutoConfig是一個簡單而有用的小工具,彌補了Maven Filtering及類似機制的不足。但它還有不少改進的余地。

  • 界面不夠直觀。如果能夠通過GUI或WEB界面來配置,就更好了。

  • Properties validator目前不易擴展。

  • 缺少集成環境的支持。

 

原文地址:http://www.openwebx.org/docs/autoconfig.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM