2010年10月21日
最近在学习如何使用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>