2010年6月13日
最近在學習如何使用maven,做了一個demo(基于S2S整合),總結一下與大家分享,期待與大家討論以期快速進步。
一、maven介紹
1、maven是什么
http://maven.apache.org/
官方解釋:Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。
2、使用maven有什么好處,解決什么問題
jar統一管理了:
如果建立了一個本地的jar倉庫,那么所有人都是從倉庫里面下載jar,拷貝項目時只需要copy幾K的源碼即可!其次,依然是倉庫,使得每個人的jar版本都是一致的,不會出現因為版本不同,引起的莫名其妙的錯誤。
項目的自動化:
只需要mvn package命令,在eclipse里面,看run里面,只需要選擇就行了!它會自動的從編譯,測試開始,一直到打包,自動的運行,保證你的包沒有問題。
我們在做多個不同的Java項目時,每個項目所用到的庫文件基本都是大同小異的,通常的做法是每個項目下面都會復制一份這些庫文件,甚至會把這些庫文件都提交到vss上去,這樣帶來的問題不僅是增大了項目占用的硬盤空間,而且也使包管理很混亂。
我們可以這樣查看jar包的依賴關系,是不是很爽?!
還可以單元測試覆蓋率報表:
2、helloword
1、下載Maven 附件中的maven3.jar 解壓到任意目錄
2、安裝eclipse插件m2eclipse
方式一:在線安裝 更新地址是:http://m2eclipse.sonatype.org/sites/m2e
方式二:本地安裝 help-->install new softeware-->add-->name填寫maven-->archive..-->jar:file:/../m2e.zip!/-->ok
安裝完成重啟eclipse,在Window-->Preferences-->Maven下配置
禁用eclipse啟動時更新maven index 主要是每次eclipse啟動時都更新很煩人
添加自己的maven
3、新建maven項目
按照下圖步驟
- groupId定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關聯。譬如在googlecode上建立了一個名為myapp的項目,那么groupId就應該是com.googlecode.myapp.
- artifactId定義了當前Maven項目在組中唯一的ID,groupId為com.googlecode.myapp的例子中,你可能會為不同的子項目(模塊)分配artifactId,如myapputil、myappdomain、myappweb等。
- version指定了項目當前的版本——1.0SNAPSHOT。SNAPSHOT意為快照,說明該項目還處于開發中,是不穩定的版本。隨著項目的發展,version會不斷更新,如升級為1.0、1.1SNAPSHOT、1.1、2.0等。
- name元素聲明了一個對于用戶更為友好的項目名稱
點擊Finish完成
4、maven項目結構
下圖為基于maven項目結構,這里跟我們以前的項目結構很不一樣,以前的項目結構約定俗成的只有兩塊 一個src 一個webRoot,當然這些都可以隨意配置,比如WebRoot有的叫WebContent

這里maven倡導約定優于配置,maven的約定就是以下目錄結構
src/main/java 下存放java類
src/main/webapp 下存放頁面文件(需要手動創建)
src/main/resources 下存放資源文件
src/test/java 下存放單元測試代碼
src/test/resources 下存放測試資源文件
5、添加jar包
只需維護pom.xml
比如添加struts2-core
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.0.11.2</version>
</dependency>
我在172.20.66.230上部署了一個maven倉庫,訪問地址http://172.20.66.230:8081/nexus/
maven會根據pom.xml中的配置訪問230的倉庫下載對應的jar source 以及doc,下載到哪?這要看maven3/conf/settings.xml 55:
<localRepository>F:/Maven3/repository</localRepository>
6、編寫代碼
附件中有一個struts2+spring 的demo,解壓然后import eclipse
在項目名上右鍵 run as -->Run Configurations
按圖配置,點擊Run即可。瀏覽器中訪問http://localhost:8080/MavenSSH/
Maven運行的生命周期
===========================
-
以上是一個簡單的例子,只是用它獲取依賴的jar包 。maven還有很多諸如項目管理方面的功能,比如文檔編制、發布管理、配置管理...
-
第一個次運行項目會比較慢,因為要下載jar包。
-
MavenSSH.rar是一個struts2與spring集成的例子,頁面用到了sitemesh div+css 也值得學習
-
項目debug是運行在jetty(類似于tomcat的容器)中。
如果部署GAE時正在upload files時退出,下次部署時會報錯
Another transaction by user is already in progress for this app and major version. That user can undo the transaction with appcfg.py's "rollback" command
找到eclipse中的GAE SDK目錄
如:D:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle.1.3.8_1.3.8.v201010161055\appengine-java-sdk-1.3.8\bin
執行命令
appcfg.cmd rollback 后面跟gae項目war所在目錄
如 appcfg.cmd rollback D:/spring/eclipse_workspace/taobaoke/war
執行:
********************************************************
Warning: Future versions of the Dev App Server will require Java 1.6 or later. P
lease upgrade your JRE.
********************************************************
Reading application configuration data...
2010-11-15 9:34:23 com.google.apphosting.utils.config.AppEngineWebXmlReader read
AppEngineWebXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/ap
pengine-web.xml
2010-11-15 9:34:23 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/we
b.xml
2010-11-15 9:34:23 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/cr
on.xml
Beginning server interaction for taokeapp...
0% Rolling back the update.
Success.
Cleaning up temporary files...
在網上無意搜到一個用Ext實現的淘寶客,恩 ,咱用GWT做一個車輪
下了淘寶的 SDK for java就開干 參考API文檔按部就班
在淘寶的沙箱里測試,很順利,乘勝前進,到正式環境下測試
問題來了
invalid signature
網上搜了一通,有說時間戳不對,果不其然,GAE使用的是標準時間,整整差了8小時,遂在獲得的當前時間上加了8小時,OK
invalid signature 可能的另一個原因是APP_KEY 或 APP_SERCET不正確,仔細檢查
調用 taobao.item.get
是
1 TaobaoClient client=new DefaultTaobaoClient(TaobaokeConstant.SANDBOX_URL, TaobaokeConstant.APP_KEY, TaobaokeConstant.APP_SERCET);
2 ItemcatsGetRequest req=new ItemcatsGetRequest();
3 java.util.Calendar c=java.util.Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
4 c.add(Calendar.HOUR, 8);
5 req.setTimestamp(c.getTime().getTime()) ;
6 req.setParentCid(new Long(0));
7 ItemcatsGetResponse response=client.execute(req);
8 return response.getItemCats();
調用 taobao.taobaoke.items.get
1 TaobaoClient client=new DefaultTaobaoClient(TaobaokeConstant.SANDBOX_URL, TaobaokeConstant.APP_KEY,TaobaokeConstant.APP_SERCET);
2 TaobaokeItemsGetRequest req=new TaobaokeItemsGetRequest();
3 req.setFields("num_iid,title,nick,pic_url,price,click_url,commission,commission_rate,commission_num,commission_volume,shop_click_url,seller_credit_score,item_location,volume,taobaoke_cat_click_url,keyword_click_url");
4 req.setCid(Long.parseLong(cid));
5 req.setNick(TaobaokeConstant.NICK);
6 req.setSort("commissionRate_desc");
7 TaobaokeItemsGetResponse response=client.execute(req);
8 return response.getTaobaokeItems();
沒找到原因
改用自己寫的緩存,然后用App Engine Cron 服務管理緩存
corn.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <cronentries>
3 <cron>
4 <url>/cron/recache</url>
5 <description>Repopulate the cache every 1 hours</description>
6 <schedule>every 1 hours</schedule>
7 </cron>
8 </cronentries>
摘要: 01 var $j = jQuery.noConflict();
02 //使用此方法驗證所有text textarea 是否含有非法字符
03 $j(document).ready(function(){
04 $j("input[type='text']").each(functio...
閱讀全文