autoconfig是阿里巴巴提供的一款開源web項目配置工具,源代碼svn地址爲 http://code.taobao.org/svn/webx/citrus-tool/trunk/。在checkout的源代碼的根目錄下運行 mvn clean install -Dmaven.test.skip。因爲autoconfig使用maven build,安裝以前必須先安裝maven。html
提供項目配置文件中的placeholder(¥{****})佔位符替換功能 ,支持編譯時替換,運行時替換。java
例如在webx中定義的placeholder
web
<services:webx-configuration />正則表達式
<services:webx-configuration >app
<services:productionMode> ${productionMode:true}</services:productionMode>框架
</services:webx-configuration> webapp
在啓動時能夠加入 jvm 參數:-productionMode=false|true 指定使用哪種模式,默認值爲true 在${productionMode:true}中已經設置了默認值。jvm
autoconfig優勢:maven
配置文件是靜態的,只須要在編寫時加入佔位符。在具體時環境中替換不一樣的參數自己不須要修改。 svn
能夠隨時改變參數的值,只須要在啓動時指定不一樣的jvm參數或指定不一樣的properties文件便可。
配置文件與程序分離,不須要在程序中加入特定邏輯,低耦合便於應用。
不足:
並非全部的框架都支持autoconfig
支持該技術的框架各有不一樣的用法。例如:Spring和Log4j都支持placeholder替換,然則它們的作法是徹底不一樣的。Spring經過PropertyPlaceholderConfigurer
類來配置,而Log4j則須要在DomConfigurator
中把參數傳進去。
autoconfig 使用:
1:集成在maven中
在maven中加入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>
每次mvn package 或 mvn install 執行時都會自動引用 autoconfig 根據auto-config.xml配置的信息進行替換。
2:獨立使用
autoconfig-1.2.tgz
根據提示安裝完成,最簡單操做 autoconfig test.war
autoconfig 配置:
核心配置文件:auto-config.xml 默認文件位置/src/main/resources/META-INF/autoconf/auto-config.xml
。或/META-INF/autoconf/auto-config.xml(是否能夠修改還不知道,大神們知道的求指導)
autoconfig結構
---第一行xml格式,即制定編碼格式
<?xml version="1.0" encoding="UTF-8"?>
<config>
<group>
-- 組冊屬性,每個用到的屬性(${***})都須要在這裏註冊,property 完整格式
<property
name="..." ---名稱 [defaultValue="..."] --默認值 [description="..."] --描述 [required="true|false"] --是否必須 > <validator name="..." /> --驗證規則 <validator name="..." />-- 能夠有多個 ... </property>
********************************************
<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" />
--指定對那些.xml 進行替換 <generate template="WEB-INF/common/resources.xml" /> </script> </config>
autoconfig 屬性(auto-config.xml中的property)中的驗證規則
<validator name="boolean" /> 取值只能時 false 或 true
<validator name="chioce" chioce="trace,debug,info,warn,error"/> 取值只能是限定的chioce選項
<validator name="emial"/> 郵件格式驗證
<validator name="fileExist" [file="WEB-INF/web.xml ,WEB-INF/conf/"] /> 配置的文件或路徑必須已經存在, file是可選項用於配置選擇文件或文件夾的位置
<validator name="hostExist" /> 值必須爲合法的IP地址,或者能夠解析獲得的域名。
<validator name="keyword" /> 值必須爲字母、數字、下劃線的組合。
<validator namae="number" /> 值必須是munber
<validator name="regexp" regexp="..." [mode="exact|prefix|contain"] />。
值必須符合regexp所指的正則表達式。
其中,mode爲匹配的方法:
徹底匹配exact
前綴匹配prefix
包含contain
如未指定mode,默認mode爲contain
<validator name="url" [checkHostExist="false",protocols="http,https",endsWithSlash="true"] 指定是否驗證主機,限制協議,假如指定了endsWithSlash=true
,那麼URL必須以/結尾。
auto-config 中generate的配置選項
<generate
template="..." --指定須要修改的文件 [destfile="..."] --修改後的文件名 默認與原文件同名 [charset="..."] -- 指定讀取文件的編碼格式 若是是xml 或讀取xml配置charset編碼格式 ,對其它文件必須指定charset
[outputCharset="..."] --輸出文件編碼格式 默認和原文件相同編碼格式 >
定義完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.xml
、file2.xml
、file3.xml
放在下面的位置:
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 │ └─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
所在的目錄下發現模板文件,就使用它;
不然在包的根目錄中查找模板文件;若是兩處均未找到,則報錯。
書寫模板是很簡單的事,你只要:
把須要配置的點替換成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的語法。
參考網址:http://www.openwebx.org/docs/autoconfig.html