Posted by Ryan on 2010/05/02
- 构建生命周期
- Maven使用POM描述项目,将其建模成一些名词.在Maven中这些“动词”是由Maven插件包装的一些目标,它们绑定到一个构建生命周期的阶段中.当你让Maven构建一个项目的时候,你其实是让它一步步通过那些预定义的有序的阶段,并且运行所有注册到某个特定阶段的目标
-
Maven中有三种标准的生命周期:清理(clean),默认(default)(有时候也称为构建),和站点(site)
- 清理生命周期 (clean):它包含了三个生命周期阶段pre-clean,clean,post-clean
- 简单的运行clean:clean目标不会完整的执行该生命周期,但是指定clean阶段就能使用clean生命周期,并且逐个的经过生命周期阶段,直到到达clean阶段(可能未到post-clean阶段就停了)
- 指定post-clean阶段能经过完整的clean生命周期,直到post-clean阶段.
- 直接运行pre-clean阶段会提示:[INFO] No goals needed for project – skipping.可以在它的构建配置中,绑定了某个目标至pre-clean阶段
- 可以自定义Clean插件的行为去删除构建输出目录以外的文件
- 默认生命周期 (default):它是一个软件应用程序构建过程的总体模型。第一个阶段是validate,最后一个阶段是deploy
- 站点生命周期 (site):它包含了四个阶段:1. pre-site 2. site 3. post-site 4. site-deploy 默认绑定到站点生命周期的目标是:1. site – site:site 2. site-deploy -site:deploy
- 在上述这些生命周期里,如果某个生命周期阶段没有目标绑定在其上,运行该阶段会提示[INFO] No goals needed for project – skipping
» Read more…
Posted by Ryan on 2010/05/02
- POM
- POM是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”
- 我们已经确定了POM是描述性和声明性的,它不像Ant或者Make那样提供显式的指令,我们也注意到POM的概念不是特定于Java的
- 超级POM:它是Maven安装的一部分,可以在/usr/local/maven/lib中的maven-2.0.9-uber.jar文件中找到。如果你看一下这个JAR文件,你会看到在包org.apache.maven.project下看到一个名为pom-4.0.0.xml的文件
- 默认的超级POM定义了一个单独的远程Maven仓库,该配置可以通过一个自定义的settings.xml文件来覆盖.注意这个默认的超级POM关闭了从中央Maven仓库下载snapshot构件的功能
- 默认的插件仓库就是这个中央仓库。Snapshot被关闭了,而且更新策略被设置成了“从不”,这意味着Maven将永远不会自动更新一个插件,即使新版本的插件发布了。
- build元素设置Maven标准目录布局中那些目录的默认值
- 从Maven 2.0.9开始,超级POM为核心插件提供了默认版本
- 所有的Maven POM都继承自超级POM
- Maven开始于超级POM,然后使用一个或多个父POM覆盖默认配置,最后使用当前项目的POM来覆盖之前生成的配置结果。最后你得到了一个混合了各个POM配置的有效POM。如果你想要查看项目的有效POM,你需要运行Maven Help插件的effective-pom目标
- 项目版本
- Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本号
-
限定版本用来标识里程碑构建:alpha和beta发布,限定版本通过连字符与主版本,次版本或增量版本隔离
-
如果你的版本号与格式<主版本>.<次版本>.<增量版本>-<限定版本>相匹配,它就能被正确的比较,这种比较基于主版本,次版本,和增量版本的数值,如果不标准,就会使用字符串进行比较.
- Maven会将限定版本后面的数字认作一个构建版本.但构建版本的解析还是使用字符串进行比较.可以使用“alpha-02”和“alpha-10”来解决
-
如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC(协调世界时)(没试过)
-
LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件。RELEASE是指仓库中最后的一个非快照版本.如果你处于软件开发过程中,你可能想要使用RELEASE或者LATEST,这么做十分方便,你也不用为每次一个第三方类库新版本的发布而去更新你配置的版本号。但当你发布软件的时候,你总是应该确定你的项目依赖于某个特定的版本
» Read more…
Posted by Ryan on 2010/04/29
- Maven的生命周期怎么理解?
-
一个阶段是“构建生命周期”中的一个步骤。生命周期是指包含在一个项目构建中的一系列有序的阶段
- 插件目标可以附着在生命周期阶段上。随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标
- 生命周期:第10章
- 学习使用Help插件
- help:active-profiles
列出当前构建中活动的Profile(项目的,用户的,全局的)。
- help:effective-pom
显示当前构建的实际POM,包含活动的Profile。
- help:effective-settings
打印出项目的实际settings, 包括从全局的settings和用户级别settings继承的配置。
- help:describe
描述插件的属性。它不需要在项目目录下运行,但是你必须提供你想要描述插件的 groupId 和 artifactId。也可以传入插件的前缀(如help)如: mvn help:describe -Dplugin=help -Ddetail(书上用-Dfull)
- 运行mvn的方式
- mvn archetype:create 这里archetype是一个插件标识而create是目标标识,一个Maven插件是一个单个或者多个目标的集合.该命令没有创建 src/main/resources目录
-
create目标定义了一个配置属性archetypeArtifactId,不指定时它有一个默认值为maven-archetype-quickstart,生成的目录名与artifactId匹配.指定 archetypeArtifactId 为 maven-archetype-webapp,将创建一个web项目.
- mvn package 命令行并没有指定一个插件目标,而是指定了一个Maven生命周期阶段.生命周期是包含在一个项目构建中的一系列有序的阶段
» Read more…
Posted by Ryan on 2010/04/18
缓存的主要目的是降低数据库的读写压力,是维护大型网站稳定运行必不可少的优化手段之一,下面,结合我近段时间的工作经验,谈谈我对缓存设计的一些想法:
缓存主要分为页面缓存和数据缓存:
页面缓存
分为整体缓存和局部缓存
优点:
- 实现简单
- 能有效降低数据库的查询压力
缺点:
- 一个网页的各个区域的内容更新频率及对实时性的要求不一样,结果为了迁就更新频率的区域,要让整个页面都跟着更新,导致性能的浪费.
- 局部缓存能解决上一个缺点,但如果页面区域过多,维护这么多个区域的更新策略将是件痛苦的事
- 只能缓存最终生成的HTML,一些动态数据无法缓存,如用户登录后的session
- 只能减轻数据的读取压力,无法降低写入的压力
综合考虑上面的优缺点,将页面缓存在memcached里面显得意义不大,我决定将页面缓存主要通过生成静态文本来实现,而数据缓存则用memcached来实现.
数据缓存
memcached使用key-value来存储数据, 通过简单的get/set方法即可实现缓存的读取/写入,并且可以针对每个缓存项设置数据过期时间.
读取缓存
需要读取缓存的数据,只需从数据库取出并将其封装在一个对象里,再将该对象存入memcached即可实现数据的缓存,从而有效地降低数据库的读取压力.
写入缓存
有些数据写入很频繁(如页面的访问量统计),这时就可以将待更新的数据先放入memcached中,等累积到一定程度后再一次性写入数据库,就拿访问量统计来说,可以每访问1000次后将数据写回数据库一次,从而有效降低数据库的写入压力,并且,memcached提供了原子加法,能有效解决线程安全上面的问题.
分布式缓存
当网站规模变大,势必要增加多台memcached服务器,那么,如何有效地规范数据的缓存方案呢?
一种方案是根据业务规则来区分,不同的业务放在不同的服务器里,不过这种方案很难保证压力的均衡,并且很难扩展.
另一种方案是用类似于”取模”的方法来实现.可以将键值经过特定的算法运算后,对N取模,余数便是最终要存入的memcached服务器的编号.其中,N表示服务器的数量,以后要扩展,只需把N做相应的增加即可.
Posted by Ryan on 2010/04/16
在上一篇Linux下安装FTP服务器(vsftpd)(一)中,我向大家介绍如何了在Linux(Ubuntu)下搭建vsftpd,并实现文件的上传下载,但如果你想要更多的控制,比如你想只能让ryan可以上传文件,而其它用户不可以,那么,是时候用到我们先前设置的user_config_dir,之前我们指定的值为/etc/vsftpd_user_conf,那么要在该文件上加上如下内容:
local_root=/usr/ftp_store
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
运行sudo invoke-rc.d vsftpd reload重新加载一下,现在,ryan可以上传文件了,如果你还希望只能上传到限定目录,那么
sudo mkdir /home/ftp/incoming
sudo chown ftp:nogroup incoming
sudo chmod 770 /home/ftp/incoming
sudo chmod -w /home/ftp
这样,ftp用户就不可以上传文件到home/ftp了(ftp是FTP服务目录的拥有者,无法在终端登录,是隐藏在所有虚拟用户背后的真实用户),同时,一般用户也无法列出/home/ftp/incoming下的文件,如果希望ryan能看到自己上传的文件,那么还要在/etc/vsftpd_user_conf加上anon_world_readable_only=NO,这样ryan就能看到自己上传的文件了.