1、ssh 登錄linux時,報: ssh_exchange_identification: Connection closed by remote host
google了好一陣,才找到線索。主要由于我前晚寫shell腳本調試的時候,誤將一些系統文件的宿主為新用戶了。后來新的會話怎么都登錄不上去了,好在還有一個root登錄的會話,找到/var/empty/sshd,修改宿主及權限。
chown -R root:root /var/empty/sshd
chmod 700 /var/empty/sshd
2、su 切換用戶,輸入密碼總是提示:密碼不正確。
也是權限問題,root切到其他賬號時沒有問題;其他賬號之間切換就是不行,密碼輸入也正確。后來其到/bin/su 文件的權限不正確,調整如下解決問題:
-rwsr-xr-x 1 root root 61144 Jul 30 2007 /bin/su
posted @
2009-08-13 18:34 josson 閱讀(199) |
評論 (0) |
編輯 收藏
一般業務系統中總會存在一些基礎數據,在其他的業務單據中會被套引用。因此,系統必須保證這些被業務單據引用的基礎數據不能任意的刪除。最常見的做法就是,在刪除基礎數據時,預先校驗該類數據是否在相關業務表中存在,若不存在才允許用戶刪除,否則給用戶以提示。
但這樣的處理方法,有些缺點,就是需要編碼對每個業務類提供查詢方法,或在刪除邏輯中增加判斷邏輯。因此,每次引用關系變化,增加或減少時免不了要修改原來的邏輯,時間越長,系統的維護成本就越來越高了。因此,有必要對系統進行重構,將這類的處理邏輯進行抽象,單獨封裝成一個服務,當引用關系有變更時,不用再修改原有邏輯,通過配置就可以完成變更。
通用引用關系查詢服務,主要就是通過db表或xml配置文件,對系統中每個基礎數據有引用的所有關系進行定義,定義屬性主要是引用的表及字段名稱。查詢時,從配置文件中讀取指定類別的引用關系,并逐一查詢這些表中的記錄,以確定數據是否被引用。這種處理方法的優點為,易擴展、可維護性強,引用關系變更時,僅通過維護配置文件,不必進行編碼,就能實現,這樣能大大的提高系統的穩定性。
xml配置文件如下:
<rule bizName='product' desc="產品關聯項定義">
<item>
<refTable>sale_item</refTable>
<refField>product_id</refField>
<!-- 用于查詢條件的擴展,允許為空 -->
<extCondition>CORP_ID = #corpId#</extCondition>
</item>
<item>
<refTable>sale_order_item</refTable>
<refField>product_id</refField>
<extCondition>CORP_ID = #corpId#</extCondition>
</item>
</rule>
<rule bizName='customer' desc="客戶關聯項定義">
<item>
<refTable>sale_order</refTable>
<refField>cust_id</refField>
<extCondition>CORP_ID = #corpId#</extCondition>
</item>
<item>
<refTable>sale_bill</refTable>
<refField>cust_id</refField>
<extCondition></extCondition>
</item>
... ...
</rule>
通用業務引用查詢類代碼片段如下:
public class BizReferenceService implements IBizReferenceService {
private static Map<String,List<BizReferenceRule>> ruleMaps;
private static final String PATTERN = "#[\\w]+#";
private static final String CFG_FILE = "bizReferenceRule.xml";
... ...
/**
* 查詢指定業務數據是否被其他業務表關聯依賴.
* @param bizName 關聯業務名稱
* @param bizId 關聯業務ID.
* @param extParam 擴展條件
* @return true 被關聯/false 未被關聯.
*/
public boolean isBizReference(String bizName,String bizId,Map<String,Object>extParam) throws ServiceException {
Assert.notNull(bizName, "業務名稱不能為空,bizName is NULL。");
Assert.notNull(bizId, "記錄ID不能為空,bizId is NULL。");
try {
//逐個檢查依賴項是否有數據關聯.
List<BizReferenceRule> rules = getBizRelationRule(bizName);
for(BizReferenceRule rule : rules){
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("select count(*) from ").append(rule.getRelTable()).append(" where ")
.append(rule.getRelField()).append("='").append(bizId).append("' ");
String extConditon = rule.getExtCondition();
if(StringUtil.isNotBlank(extConditon)){
initTenantParam(extParam);
sqlBuilder.append(" and ").append(getExtParamSql(extConditon,extParam));
}
logger.debug(sqlBuilder);
int nCount = bizReferenceDao.getBizRelationCount(sqlBuilder.toString());
if (nCount != 0) return true;
}
return false;
}
catch(Exception ex){
logger.error("調用業務關聯服務錯誤。"+bizName+",bizId:"+bizId+",extParam"+LogUtil.parserBean(extParam),ex);
throw new ServiceException("調用業務關聯服務錯誤。");
}
}
/**
* 組裝擴展查詢條件的sql
* @param condition
* @param extParam
* @return
* @throws Exception
*/
private String getExtParamSql(String condition,Map<String,Object>extParam) throws Exception {
List<String> paramList = parseDyncParam(condition);
for(String param : paramList){
String simpleParam = simpleName(param);
if(!extParam.containsKey(simpleParam)){
throw new ServiceException("動態參數值未設置! param:"+param+",extParam:"+LogUtil.parserBean(extParam));
}
condition = condition.replaceAll(param, "'"+String.valueOf(extParam.get(simpleParam))+"'");
}
return condition;
}
/**
* 解析擴展查詢條件中的動態參數名.
* @param condition
* @return
* @throws Exception
*/
private List<String> parseDyncParam(String condition) throws Exception {
PatternCompiler compiler = new Perl5Compiler();
PatternMatcher matcher = new Perl5Matcher();
MatchResult result = null;
PatternMatcherInput input = null;
List<String> paramList = new ArrayList<String>();
input = new PatternMatcherInput(condition);
Pattern pattern = compiler.compile(PATTERN,Perl5Compiler.CASE_INSENSITIVE_MASK);
while (matcher.contains(input, pattern)){
result = matcher.getMatch();
input.setBeginOffset(result.length());
paramList.add(result.group(0));
}
return paramList;
}
/**
* 獲取業務關聯查詢規則.
*/
private List<BizReferenceRule> getBizRelationRule(String bizName){
Assert.notNull(bizName, "業務名稱不能為空,bizName is NULL。");
//配置定義未加載到內存時,讀取配置文件
if(ruleMaps == null){
parseRuleConfig();
if(ruleMaps == null) return null;
}
return ruleMaps.get(bizName);
}
/**
* 讀取業務關聯規則配置文件
*/
@SuppressWarnings("unchecked")
private synchronized void parseRuleConfig(){
if(ruleMaps != null){
return;
}
//解析業務引用定義文件.

}
/**
* 讀取Xml文檔
* @return
*/
private Document getXmlDocument(){
InputStream is = null;
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
is = loader.getResourceAsStream(CFG_FILE);
SAXBuilder sb = new SAXBuilder();
return sb.build(new BufferedInputStream(is));
}
catch(Exception ex) {
logger.error("讀取配置文件錯誤. file:"+CFG_FILE, ex);
return null;
}
finally {
try {
if(is != null){
is.close();
is = null;
}
}
catch(Exception ex) {
logger.error(ex);
}
}
}

}
其他的一些可選處理方法:
b. 在客戶表增加引用計數字段;
需額外維護引用計數字段,在引用的業務邏輯增加或刪除記錄時,需對該字段的數值進行更新。適用于需要直接查詢記錄被引用次數的場景,但在集群環境下,需注意并發問題。
posted @
2009-07-14 14:42 josson 閱讀(385) |
評論 (0) |
編輯 收藏
關于瀏覽器的clientHeight、offsetHeight和scrollHeight
在IE、FireFox、Netscape等不同的瀏覽器里,對于document.body 的 clientHeight、offsetHeight 和 scrollHeight 有著不同的含義,比較容易搞混,現整理一下相關的內容:
clientHeight:在上述瀏覽器中, clientHeight 的含義是一致的,定義為網頁內容可視區域的高度,即在瀏覽器中可以看到網頁內容的高度,通常是工具條以下到狀態欄以上的整個區域高度,與具體的網頁頁面內容無關。可以理解為,
在屏幕上通過瀏覽器窗口所能看到網頁內容的高度。
offsetHeight:關于offsetHeight,ie和firefox等不同瀏覽中意義有所不同,需要加以區別。在ie中,offsetHeight 的取值為 clientHeight加上滾動條及邊框的高度;而firefox、netscape中,其取值為是實際網頁內容的高度,可能會小于clientHeight。
scrollHeight:scrollHeight都表示瀏覽器中網頁內容的高度,但稍有區別。在ie里為實際網頁內容的高度,可以小于 clientHeight;在firefox 中為網頁內容高度,最小值等于 clientHeight,即網頁實際內容比clientHeight時,取clientHeight。
clientWidth、offsetWidth 和 scrollWidth 的含義與上述內容雷同,不過是高度變成寬度而已。
若希望clientHeight、offsetHeight和scrollHeight三個屬性能取值一致的話,可以通過設置DOCTYPE,啟用不同的解析器,如:<!DOCTYPE HTML PUBLIC "DTD XHTML 1.0 Transitional">,設置DOCTYPE后,這三個屬性都表示實際網頁內容的高度。
通過以下HTML代碼,可以了解一下這三個屬性的含義:
<!DOCTYPE HTML PUBLIC "DTD XHTML 1.0 Transitional"> //設置DOCTYPE
<HTML>
<HEAD>
<TITLE> 測試。 </TITLE>
</HEAD>
<script type='text/javascript'>
window.onload = function(){
var ch = document.body.clientHeight;
var sh = document.body.offsetHeight;
var ssh = document.body.scrollHeight;
alert('clientHeight:'+ch+'; offsetHeight:'+sh+"; scrollHeight:"+ssh);
}
</script>
<BODY style='margin:0px'>
<div style='background-color:#ccc; height:400px; padding:0px'>
text
</div>
</BODY>
</HTML>
根據頁面內容調整窗口高度的方法:
Ext.util.ResizeWin = function() {
try {
var sh = document.documentElement.scrollHeight
|| document.body.scrollHeight;
var ch = document.documentElement.clientHeight
|| document.body.clientHeight;
window.resizeBy(0,(sh-ch));
}catch (e){}
};
posted @
2009-06-14 16:48 josson 閱讀(1497) |
評論 (0) |
編輯 收藏
我們通常依賴單元測試工具Luntbuild,來發現代碼中有許多隱藏的錯誤或不良的編碼,然后再去修正。這樣從發現問題,到解決問題花費很多功夫。其實我們可以利用一些java代碼分析工具,來及時發現相關的問題。如findbugs,luntbuild就是集成了findbugs插件來發現一些代碼上的問題。
findbugs 當前版本為:1.3.9,其下載地址如下(包括eclipse插件):
findbugs :http://findbugs.sourceforge.net/index.html
findbugs for eclipse : http://findbugs.sourceforge.net/downloads.html
documents: http://findbugs.sourceforge.net/manual/
插件安裝比較簡單,將findbugs for eclipse 插件文件(zip)下載后,直接解壓至$eclipse.home$/plugins/目錄下,重啟eclipse即可使用。你可以通過查看:(eclipse 3.4) about ecliplse platform -> plug-ins details 中找到findbugs 插件安裝信息。
Findbugs 的使用:
在Package Explorer或Navigator視圖中,選中你的Java項目,右鍵,可以看到“Find Bugs”菜單項,子菜單項里有“Find Bugs”和“Clear Bug Markers”等項。點擊Find Bugs 后,開始分析項目中隱藏的代碼問題,發現的問題會在相應的代碼行上進行標記,或者在Bug Explorer中顯示所有的問題(findbug視圖,window -> show view -> others 可以找到Bug Explorer.) 我們就可以根據findbugs發現的問題,進行逐一解決,提高代碼質量。
Findbugs 的一些配置說明:
FindBugs是一個基于“Bug Patterns”進行分析并找出Java程序中隱藏的Bugs。打開 Window -> preferences ,對findbugs 的分析規則進行定義,如圖:
posted @
2009-06-13 23:55 josson 閱讀(1240) |
評論 (0) |
編輯 收藏
http://java.decompiler.free.fr/
一個不錯的java反編譯工具,有gui及eclipse插件。
posted @
2009-05-21 08:34 josson 閱讀(242) |
評論 (0) |
編輯 收藏
實現javascript文件壓縮的批處理腳本,腳本完成的內容:
1、利用一個windows script 刪除js文件中的空白字符及注釋;
2、通過gzip.exe 將js文件壓縮打包成gzjs文件。gzip.exe 下載地址:
http://www.gzip.org
相關文件請下載附件:
js 壓縮批處理 。
使用方法:
a. 雙擊運行 gzjs.bat ,提示輸入javascript文件名(帶路徑).
b. 輸入待壓縮的js文件,或者拖動js文件到command窗口(可直接在eclipse視圖中拖動js文件到cmd窗口)。
c. 回車后,在js文件所在目錄會生成一個相同文件名的gzjs文件。
批處理文件內容如下:
@echo off

if not "%1" == "" (
set JSFILE=%1
goto ZIPING
)

:INPUT_FILENAME
set /P JSFILE=請輸入待壓縮的JS文件名:
if "%JSFILE%"=="" (
echo ERROR: JS文件名稱必須指定!
goto INPUT_FILENAME
)

:ZIPING
set MINJS_FILENAME=c-ziped.js
if not exist %JSFILE% (
echo ERROR: 文件:%JSFILE%不存在!
goto INPUT_FILENAME
)

rem 壓縮Javascript文件.
if exist %MINJS_FILENAME% del %MINJS_FILENAME%
CScript /nologo pack.wsf %JSFILE% >> %MINJS_FILENAME%
if not "%ERRORLEVEL%"=="0" (
echo ERROR: JS文件壓縮失敗:%JSFILE%
goto END
)

rem 打包js文件為.gzjs
gzip -9 %MINJS_FILENAME%
for %%i in ("%JSFILE%") do (
set FILENAME=%%~ni
set JS_FILEPATH=%%~di%%~pi
rem echo %JS_FILEPATH%
)

rem 壓縮文件名及重命名的文件名.
set GZIPED_FILE=%FILENAME%.gzjs
set TMP_GZIPED_FILE="%MINJS_FILENAME%.gz"

rem 重命名.
if exist %GZIPED_FILE% del %GZIPED_FILE%
call ren %TMP_GZIPED_FILE% %GZIPED_FILE%
if not "%ERRORLEVEL%"=="0" (
echo ERROR: JS壓縮文件打包失敗:%TMP_GZIPED_FILE%
goto END
)

rem 移動壓縮文件到源目錄.
set TARGET_GZJS=%JS_FILEPATH%%GZIPED_FILE%
call move /Y %GZIPED_FILE% %TARGET_GZJS%
echo done. %TARGET_GZJS%

:END
pause
Apache配置,以支持gzjs文件格式(http header的Content-Encoding=gzip):
<FilesMatch "\.gzjs$">
Header add Content-Encoding gzip
</FilesMatch>
posted @
2009-03-19 22:22 josson 閱讀(1049) |
評論 (0) |
編輯 收藏
一、Use Case 概述 Use Case,它描述的是一個操作,而不是一個功能。傳統的軟件模型設計喜歡在需求分析把業務分解成功能模塊,這樣的弊端就是混淆了需求和設計的界限,因為功能模塊的劃分牽涉到系統的概要設計。在RUP里面提倡用use case來代替功能模塊的劃分。與功能模塊不同的是,用例是站在用戶的角度來分解系統,用戶并不想了解系統的內部結構和設計,他們關心的是系統所能提供的服務,即系統是如何去操作的,這就是用例的基本思想。用例模型主要由以下元素組成:
1、參與者(Actor):參與者是與系統發生交互的外部用戶、系統或其他硬件設備,參與者可以是人、另一個計算機系統或一些可運行的進程等。
2、用例(Use Case):用例用于表示系統所提供的服務,它定義了系統是如何被參與者所使用的,它描述的是參與者為了使用系統所提供的某一完整功能而與系統之間發生的一段對話。
3、通訊關聯(Communication Association) :通訊關聯用于表示參與者和用例之間的對應關系,它表示參與者使用了系統中的哪些服務(用例),或者說系統所提供的服務(用例)是被哪些參與者所使用的。
二、用例之間的關系
1、包含(include),將若干用例中一些相同的行為,單獨抽象成一個的用例,然后其他用例來包含這個用例。這樣避免在多個用例里面重復設計同一個操作,也避免同一個操作在不同的用例里面的描述出現不一致。需要修改的時候,也只需要一個用例,避免修改多個用例出現的不一致和重復工作。例如:銀行ATM系統,用戶取款、存款時,都會打印憑證,我們將打印憑證抽象出來,取款、存款等操作時包含打印任證這個行為。
2、擴展(extend),擴展是將事件流中一些相對獨立并且可選的行為擴展為新的用例,并且在基用例上的擴展點進行擴展。與包含關系不同的是,包含的事件是必須存在的動作,并且該用例的事件流一定要插入到基礎用例中;而擴展是提供一些備選動作,可根據條件來決定是否將擴展用例的事件流插入基礎用例的事件流中。擴展也可以抽象為基用例的備選流,擴展出來的用例可以讓基用例變得更加簡練。例如:在通話業務的基礎上可擴展一些增值業務,如語音信箱、呼叫轉移等。
3、泛化(generalization) ,也叫繼承(泛化是分析領域術語,繼承是設計和實現領域術語,通常用繼承來解決泛化問題)。當多個用例擁有相同的結構、行為時,我們可以把它們的共性部份抽象出來成為父用例,而其他用例作為泛化關系中的子用例。在泛化關系中,子用例是父用例的特殊形式,子用例繼承了父用例所有的結構、行為以及關系。例如:訂票是網上訂票用例和電話訂票用例的抽象。
三、建立用例模型
1、確定參與者,可以從以下問題入手:
系統開發完成之后,有哪些人會使用這個系統?
系統需要從哪些人或其他系統中獲得數據?
系統會為哪些人或其他系統提供數據?
系統會與哪些其他系統相關聯?
系統是由誰來維護和管理的?
2、確定用例,尋找用例可以從以下問題入手(針對每一個參與者):
參與者為什么要使用該系統?
參與者是否會在系統中創建、修改、刪除、訪問、存儲數據?如果是的話,參與者又是如何來完成這些操作的?
參與者是否會將外部的某些事件通知給該系統?
系統是否會將內部的某些事件通知該參與者?
posted @
2009-03-19 22:21 josson 閱讀(492) |
評論 (1) |
編輯 收藏
UML(統一建模語言 Unified Modeling Language)是一種標準的圖形化建模語言,是面向對象分析與設計的一種標準表示。
UML體系統比較復雜,內容較多,我們可以根據實際情況選擇性的學習,部份內容可日后再做深入學習。首先了解一下UMl中相關的一些概念:
UML視圖
視圖只是表達系統某一方面特征的U M L建模組件的子集。按結構劃分,描述系統中的結構成員及其相互關系,包括靜態視圖、用例視圖和實現視圖。按動態行為劃分,描述系統隨時間變化的行為,包括狀態機視圖、活動視圖和交互視圖。模型管理,說明了模型的分層組織結構,包括模型管理視圖。
主要的域
|
視圖
|
圖
|
主要概念
|
結構
|
靜態視圖
|
類圖
|
類、關聯、泛化、依賴關系、實現、接口
|
|
用例視圖
|
用例圖
|
用例、角色、關聯、擴展、包括、用例泛化
|
|
實現視圖
|
構件圖
|
構件、接口、依賴關系、實現
|
|
部署視圖
|
部署圖
|
節點、構件、依賴關系、位置
|
狀態
|
狀態機視圖
|
狀態圖
|
狀態、事件、轉換、動作
|
|
活動視圖
|
活動圖
|
狀態、活動、完成轉換、分叉、結合
|
|
交互視圖
|
順序圖
|
交互、對象、消息、激活
|
|
|
協作圖
|
協作、交互、協作角色、消息
|
模型管理
|
模型管理視圖
|
類圖
|
包、子系統、模型
|
可擴展性
|
所有
|
所有
|
約束、構造型、標記值
|
UML 圖
圖是一個具體視圖的組成部分,由模型元素的符號化的圖片組成。UML中包含以下9種:
1、用例圖(use-case diagram),用于顯示若干角色(actor)以及這些角色與系統提供的用例之間的連接關系。角色代表外部實體,如用戶、硬件設備或與系統發生交互的另一個外部系統。
2、類圖(class diagram),用來表示系統中的類和類與類之間的關系,是對系統靜態結構的描述。
3、對象圖,類似于類圖,區別在于對象圖表示類的對象實例,而不是類。
4、狀態圖,描述類的所有對象可能具有的狀態,以及引起狀態變化的事件。
5、序列圖,反映若干個對象之間的動態協作關系,也就是隨著時間的流逝,對象之間是如何交互的。
6、協作圖,其作用同序列圖,除了顯示消息變化外,協作圖還顯示對象及其之間的關系。
7、活動圖(activity diagram),描述某個操作執行時的活動狀況。
8、組件圖(component diagram),反應代碼的物理結構,可為源代碼、二進制文件或可執行文件組件。
9、展開圖(deployment diagram),用來顯示系統中軟件和硬件的物理架構,通常在圖中以結點的形式顯示實際的計算機和設備,以及各個結點之間的關系。
UML建模工具
1、StarUML http://staruml.sourceforge.net/en/
小巧的建模工具,才20來M,目前版本是 5.0 。是一個韓國人用delphi寫的,免費很關鍵。
2、JUDE http://jude.change-vision.com/jude-web/download/index.html
posted @
2009-03-19 22:21 josson 閱讀(306) |
評論 (0) |
編輯 收藏
近日,有同事遇到一個奇怪問題:在開發環境,apache能正常支持中文文件下載,但切換到測試環境就404錯誤,找不文件,兩個環境都是linux系統。我起先懷疑的是linux下需要對apache進行配置,以支持中文名。但研究了一下兩個環境的配置,開發環境除apache版本高了點外,并沒有其他特殊配置。所以懷疑版本問題,又把開發環境的apache及配置同步到了測試環境,重啟依然無效。
折騰半天,基本上可以判定這個問題應該與apache配置和版本無關了。
網上google了一把,有很多關于mod_encoding.so模塊實現中文支持和IE瀏覽器中取消"發送UTF-8 URL"的設置,考慮到開發環境并沒有加入額外的module,也沒設置IE選項,所以也沒在意這些方案,況且這兩個方案也不便于生產環境布署或實際應用。
后來,又請教了SA和其他同學,還是沒有結果。只能繼續摸索,查找原因。通過兩個環境的反復比較,終于發現了問題所在:
通過 locale 查看了系統的字符集,開發機上是en_US.UTF-8,而測試機上是zh_CN.GBK;開發機上顯示的中文文件名是亂碼,測試機上顯示正常,但反而顯示為亂碼的開發機上能被下載,而測試機上顯示正常的文件不能被下載。后來,將測試環境的字符集也設為:en_US.UTF-8,并從svn重新遷出了中文名的文件,發現確實可以被讀取到。
分析一下原因,ie客戶是發送"UTF-8 URL"到apache,apache以utf-8編碼的文件名查找相關目錄下的文件,如果此時中文文件是以GBK或其他字符集保存時,就無法找到匹配的文件。所以網上說的IE瀏覽器中取消"發送UTF-8 URL"的設置就有效的說法就可以解釋了。
結論:linux環境下apache中文文件下載支持與該文件的字符集有關,只要創建或從svn遷出中文文件文件時,linux系統為UTF-8的字符集,或中文文件名以UTF-8編碼的文件,即能被apache正確讀取。網上有資料說,apache 2.x 以上版本即支持中文文件名,雖然未經驗證,但至少可以肯定apache 2.0.55、2.0.63是沒有問題的。
posted @
2009-03-13 21:37 josson 閱讀(1147) |
評論 (0) |
編輯 收藏
《Maven權威指南》中文版
1、常用命令
mvn compile
編譯主程序源代碼,不會編譯test目錄的源代碼。第一次運行時,會下載相關的依賴包,可能會比較費時。
mvn test-compile
編譯測試代碼,compile之后會生成target文件夾,主程序編譯在classes下面,測試程序放在test-classes下。
mvn test
運行應用程序中的單元測試
mvn site
生成項目相關信息的網站
mvn clean
清除目標目錄中的生成結果
mvn package
依據項目生成 jar 文件,打包之前會進行編譯,測試。
mvn install
在本地 Repository 中安裝 jar。
mvn eclipse:eclipse
生成 Eclipse 項目文件及包引用定義,注意,需確保定義Classpath Variables: M2_REPO,指向本地maven類庫目錄。
2、pom.xml 說明
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorial.struts2</groupId>
<artifactId>tutorial</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Struts 2 Starter</name>
<url>http://www.myComp.com</url>
<description>Struts 2 Starter</description>
<dependencies>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.5</version>
</dependency>
</dependencies>
</project>
說明:
modelversion pom.xml 使用的對象模型版本
groupId 創建項目的組織或團體的唯一 Id
artifactId> 項目唯一Id, 項目名
packaging 打包擴展名(JAR、WAR、EAR)
version 項目版本號
name 顯示名,用于生成文檔
url 組織站點,用于生成文檔
description 項目描述,用于生成文檔
dependency之scope 管理依賴部署,取值如下:
compile 缺省值,用于所有階段,隨項目一起發布;
provided 期望JDK、容器或使用者提供此依賴。如servlet.jar;
runtime 只在運行時使用;
test 只在測試時使用,不隨項目發布;
system 需顯式提供本地jar,不在代碼倉庫中查找;
3、創建Maven Web項目
mvn archetype:generate -DgroupId=com.demo -DartifactId=web-app -DarchetypeArtifactId=maven-archetype-webapp
groupId 組織名,對應項目的package;artifactId 項目名;archetypeArtifactId 項目類型
posted @
2009-02-27 17:42 josson 閱讀(1100) |
評論 (0) |
編輯 收藏