Monthly Archives: May 2009

教学贴:如何编写Maven2插件

Maven插件的编写非常容易,所以,简单的几个流水帐吧。

创建插件工程

# mvn archetype:generate

选择12,回答groupId,artifactId之类的问题,工程就OK了。导入到喜欢的IDE吧。

定义插件参数

完成的定义请参考Maven官方教程,这里简要介绍。

Maven2使用了很多注释中的Annotation来定义插件行为,完整文档点这里,常见的如:

Annotation

功能介绍
@goal <goalName>所谓目标了。每个Mojo类包含一个目标,一个Plugin可能若干Mojo类也就有若干目标了

@parameter expression="${aSystemProperty}" default-value="${anExpression}"

这是用于Mojo的属性的,可以通过表达式来获取系统参数,项目参数,以及从命令行输入参数。
@required同样用于Mojo的属性,定义该参数为必须的。
  

下面是简单的代码

package com.yuchengtech.emp;

/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.File;
import java.net.URL;
import java.util.Collection;
import java.util.Iterator;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

/**
 * 用于编译EMP相关文件,生成部署资源
 *
 * @goal emp-compile
 *
 * @phase process-sources
 */
public class EmpCompileMojo extends AbstractMojo {
	/**
	 * 输出文件路径
	 *
	 * @parameter expression=
	 *            "${project.build.directory}/${project.build.finalName}/WEB-INF/tables"
	 * @required
	 */
	private File outputDirectory;

	/**
	 * EMP设计文件路径
	 *
	 * @parameter expression="${emp.design.dir}"
	 * @required
	 */
	private File empDesignDir;

	public void execute() throws MojoExecutionException {
		getLog().info("Design Files Folder: " + empDesignDir.getAbsolutePath());
		getLog().info(
				"Output Table Files Folder: "
						+ outputDirectory.getAbsolutePath());
		URL rule = this.getClass().getClassLoader().getResource(
				"rule-table.xml");
		Digester digester = DigesterLoader.createDigester(rule);

		Collection files = FileUtils.listFiles(empDesignDir,
				new String[] { "table" }, true);

		for (Iterator it = files.iterator(); it.hasNext();) {
			File table = (File) it.next();
			getLog().info("EMP: covert file - " + table.getName());
			ModelConverter convert = new ModelConverter(table, outputDirectory,
					digester);
			StringBuffer s = new StringBuffer();
			boolean result = convert.convert(s);
			if (!result) {
				throw new MojoExecutionException(s.toString());
			}
		}
	}
}

发布插件

使用简单的mvn install 之后就可以在本地使用这个插件了。或者发布到公共服务器上供更多人使用。

可以在项目中用命令行 mvn groupId:artifactId:goal来执行插件操作,也可以在项目POM中配置。

请继续参看Maven官方教程

热恋时做的梦

其实,是幸运四叶草的片尾……

未完结是很痛苦的~

恋焦がれて见た梦(热恋时做的梦)
歌手:绚香
作词:绚香
作曲:绚香

このまま一人 どこか远くへ行ってしまいたいほど
konomama hitori dokoka tooku he itte shimaitaihodo
多想就这样 消失到远方

思ってたより简単だった あなたを失うということ
omotte tayori kantan datta anatawo ushinau toiukoto
失去你 竟是如此的容易

明日が见えなくて 前に进めない时
ashita ga mie naitte mae ni susume nai toki
看不见未来 驻足不前时

あなたが私の右手 引っ张ってくれなきゃ
anataga watashi no migite hippatekurenakya
我需要你拉着我的右手

笑って「早く来いよ」って
waratte ( hayaku koi yo ) tsute
笑着说「快点来呀」

ほら いつものように
hora itsumonoyouni
喏 就和平时一样

恋焦がれて 见た梦は あなたとの日々
koi koga rete mita yume ha anatatono hibi
热恋时做的梦 是和你一起的时光

寄り添えないのに そばにいる
yori soe naini sobaniiru
无法靠近你 却近在身旁

それが一番 つらかったの
sorega ichiban tsuraka ttano
是最难忍的心伤

どうして人は恋をするのかって 谁が教えて
doushite nin ha koi wosurunoka nee dareka oshie te
为何人会恋爱 谁能告诉我

紧がることで 生まれるものが 世界に爱を讴わせる
tsunaga rukotode umare rumonoga sekai ni ai wo utawa seru
彼此相系而萌生的心意 让世界为爱讴歌

このまま步いたら また出会う日が来るの
konomama arui tararamata deau nichi ga kuru no
这样走下去 是否还能重逢

あなたにもう一度ちゃんと伝えなきゃいけない
anatanimou ichido chanto tsutae nakyaikenai
我还想再次对你表白心意

「ごめんねありがとう」って まっすぐに
(gomennetoarigatoutte) ima suguni
坦率地说出「对不起 谢谢你」

恋焦がれて 见た梦は 并ぶ二人の影
koi koga rete mita yume ha narabu futari no kage
热恋时做的梦 是两人并排的身影

帰り道に そっとキスを それが一番嬉しかったの
kaerimichi nisotto kisu wo sorega ichiban ureshi kattano
归路上的轻轻一吻 是最欣喜的过往

恋焦がれて 见た梦は あなたとの日々
koi koga rete mita yume ha anatatono hibi
热恋时做的梦 是和你一起的时光

寄り添えないのに そばにいる
yori soe nainoni sobaniiru
无法靠近你 却近在身旁

それが一番 つらかったの
sorega ichiban tsuraka ttano
是最难忍的心伤

恋焦がれて 见た梦は あなたとの日々
koi koga rete mita yume ha anatatono hibi
热恋时做的梦 是和你一起的时光

寄り添えないのに 幸せと
yori soe rudakede shiawase to
无法靠近你 却感到无比幸福

それが一番 伝えたかったの
sorega ichiban tsutae takattano
是我最想传达给你的

それが一番 伝えたかったの
sorega ichiban tsutae takattano
是我最想传达给你的

どうして人は恋をするのかって 谁が教えて
doushite nin ha koi wosurunoka nee dareka oshie te
为何人会恋爱 谁能告诉我

点名:卷一

点名点名 幸福点名,不答幸福就跑掉。
幸福点名游戏规则回答下列问题,并贴到自己的日志上,写完后,自己多加一个问题然后传给十个人,不可以点被点过的人。被你点到的人你要去跟他说,我点到你了。写完后去跟点到你的人说我写完了。不可以不写哦,不然幸福就会跑掉哦。
1. 我的大名:网络要有隐私 L
2. 我的生日:1984年10月25日。
3. 谁传给你的:埃埃
4. 生日想得到什么礼物:和某人牵手
5. 近期压力大的事:工作~找工作~找工作谈恋爱~
6. 本来想做的事:谈恋爱~
7. 有没有喜欢的人:恩。
8. 同学会要回去找老师吗:其实这是个好习惯。但是我没有
9. 跟谁出去最幸福:带自己旅行就可以了。
10. 如果你的两个好友吵架了:睡自己的觉,让他们吵去吧。
11. 跟情人最想去哪:生命中每一个地方都要~
12. 圣诞节要做啥:希望能有个假期
13. 最想跟谁过圣诞节:谁都好,要家人
14. 有没有床气:木。
15. 有几个兄弟姐妹:木)
16. 最喜欢的一首歌:
17. 喜欢什么颜色:蓝
18. 上厕所后会不会冲水:……
19. 喜欢男生还是女生:女人
20. 最想大声说什么:做人要低调
21. 半夜敢不敢自己上厕所:……
22. 最近看过最好看最欲罢不能的小说是什么:木。
23. 谁很欠打:做人要低调。
24. 现在很迷什么:累死了没空迷。
25. 睡相很差:应该还不错
26. 现在的时间:2009年5月24日,1:59。
27. 是否痛恨传给你点卷的人:没感觉。
28. 体重多少:104。
29. 今天天气:还好。
30. 你若中乐透最想做什么:买房,开公司
31. 大学生一定要玩的活动:和我没关系
32. 失眠引起的原因:。。木有失眠?
33. 你睡觉有流口水的情况:基本没有
34. 近期开心的事:没有特别开心的!
35. 你经常通宵不睡吗:一年一两次。
36. 推荐一首最近很喜欢的歌:Walk on 正在听而已
37. 你能够和陌生人谈恋爱嘛:可以谈情不能说爱
38. 自由对于你来说有多重要:不在意~
39. 你人生中最想做的事情是什么:找个女人结婚 
40. 近期的计划是什么:稳定的生活
41. 最近迷什么剧:很久不看这种。
42. 最近你好么:做人要低调。
43. 你是不懂得拒绝的人吗:做人要低调。
44. 喜欢雨天还是晴天:都喜欢。
45. 这种游戏无聊吗:我很困。
46. 喜欢现在的自己吗 :做人要低调~
1. 被点到必填,不填代表你不尊重传给你的人和问卷。
2. 请老实回答每一问题。
3. 不能擅自涂改题目。
4. 写完请点 10 位小朋友,不可以不点。
5. 完后请通知那 10 位小朋友他被点到了。
+++++++++++++++++++++++++++++
附加题:
1 .是谁传给你这份问卷的:埃埃
2 .你们认识多久呢:3年?
3 .你觉得ta对你来说重要吗:重要
4 .你与ta的关系是:陌生的好朋友
5 .请问ta的兴趣是:大晚上不睡觉。
6 .请问ta的个性如何:恩,那种给人留下很深印象的女孩。
7 .ta在你心目中是几分:反正挺高
8 .最想对ta说的一句话:好困~

 

恩,完成了,我做这种题目一向非常非常非常……无聊~

继续,我不扩散这事情……

PS: 埃埃生日快乐,如果过两天我忘了按时说就当我现在已经说了。

PPS:有时做做卷子挺好的~不过能不能不要这么长……

继续说Apache的优化

经过了前面一段时间的探索,我们对ApacheMySql的性能调优有了个初步的认识,我本来以为问题到这里应该就解决了,但是运行了十几天后,还是出现了负载达到50+的情况。于是,网站又挂了。

分析access.log与之前并无不同,被盗链的请求还是很多,不过这些都被302重定向了啊,死活想不到办法,一度怀疑是不是因为302或者404的错误日志过多的引起的IO问题导致服务器资源紧张。

除此之外,还是有个现象引起了注意,每次挂掉的不是Apache,而是数据库。为什么盗链会引起数据库问题,这显然无法解释。

不绕圈子了,最后发现的问题,就是为了防盗链而特意写的Rewrite。原本的rewrite是这样的,对于盗链的资源,重定向到首页。

这看起来没有问题,可是瞬间请求数百次到首页,然后运行脚本,执行数据库查询……

还有一点,返回的是302,这就意味着搜索引擎和下载工具会认为资源是存在的,不会停止响应。

所以,最终的解决方案。重定向所有盗链的资源到一个静态LOGO,同时,设定返回Code为403.

整个世界清净了。