Tag Archives: scm

教学贴:如何编写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官方教程

JRuby Note: 简单就是美

恩,我是一个Java中毒症患者,而且还是写了些传统程序,被传染了些OO顽疾的患者,对于Ruby这种太轻巧的东西接受起来还是有个过程的。

然而,我仍旧是个年轻人,早已坚定的支持Ruby代表的“小快灵”俱乐部,受够了传统软件工艺的铺张浪费,心存着的一点点幻想仍然让我被种种传说诱惑。

趁着一周唯二的两天不加班,研究了些JRuby 1.1.1——好吧,我就是纯粹的Java中毒症。顺便还关注了下ROX荡气回肠的季后赛第三场——然后浅浅的发现了JRuby的点点好处。

出色的SCM基础支持,小巧便捷的扩展,标准化的实现

SCM基础支持

GEM真的是非常有用的工具。Ruby毕竟晚生了几年,许多新的思路得以应用的更加完善。GEM类似于Maven的Resp,配合Rake就构成了非常好用的构建工具,连版本都被模糊化了,“我只要最新的就可以了”,是这样么?我只研究了两个小时,还只能猜猜。至于之前就听过的Raven,对于不懂Ruby的人来讲,简直比Maven还难用(我是新人,我不懂上个世纪的构建方法)。SCM早晚会成为一种标准化的事情,就像之前的Java Module被接受成为标准,每种语言形成产品都需要重视这一点。

不得不说的是ROR的DB扩展,数据迁移,在我看来,这就是很棒的数据库重构工具。重构在较小的时间段上对于软件的意义,有赶超迭代开发的趋势。而数据库重构,是其中最难最复杂的主题。虽然这不是Ruby天生的特性,但随着ROR的流行,也一定会慢慢深入人心。

模块化的扩展

Java是模块化的么,你真的确定jar和package是模块化的表现么?

动态语言天生就有这种优势,耦合和约束在非常低的水平,模块的互操作也就简单的多。加上良好的SCM,全球化的组件工厂,模块化对于Ruby,简直就是天生的完美排档。

标准化

这是一个不怎么显而易见的优点。正如标题所说,简单就是美。那么,如何简单,怎样简单?用大家都接受的概念。

用BlueCloth,HTML标签前开后闭,不用大大咧咧的程序员操心。

Wiki式的标记方法,写模板就像写文档。

学术上我们说Closure,我Ruby就实现个Closure。理论与实际尽量靠拢。“小快灵”你想要的,我最快实现。说Ajax,无非就是Autocomplete,DnD,一个单词搞定。什么,你要GoogleDoc?

前两天见了徐昊一面,于是现在对于“语言”更特质的东西很有兴趣,而所谓标准,就是直接到大多数人都觉得应该是这个样子,把一些不显而易见的东西挑明了,固定下来。当然,我说的是与钱无关的情况,虽然这种情况不存在。

完工

怨念的说,公司发调查问卷,征求个人发展计划。网上搜了搜IT认证,中国的IT培训环境糟糕的要死。高校没有软件理论,社会没有工业协作,我们的软件行业,还弱小的很呢。

Technorati 标签: ,,

Java Module and Maven

I just surfing the internet for a proper Plugin System Architecure for my tiny JavaEE application. By mistake, I notised the JSR-277 and JSR-294, something about Java Module, somewhat like an “Office Maven”.

image

The most unwelcome job for Java Developers is resolve the depandencies of the coming project especially for those out-of-date guys. Different jar packages with the same filename, the out-of-control condition brings potential risks to the project. Maven is a great tool which provide a rich description schema and a universal artifact repository for Java World. BUT Maven is burn with guilts:

  1. Not industry standard
  2. Difficult to handle with existing system
  3. Policy not allowed for a flexible usage of commercial artifact.

For Java Module? Nothing better. It will be a Java standard but optional. It has no idea about the existing mass. Large companies need lots of arguments to follow any standard.

We share the world, we suffer from the world. But it’s still interesting.

一周生活小结

呃,写周记还是不错的。

写了一周的文档,本周我打算不那么认真了。因为其实业务也就那么回事,以我超强的分析汇总能力完全不成问题。

问题是上班时间改为八点半。OMG,难道只能天天迟到了?

XIB的需求拖了一周才发过来,毛哥一个劲说抱歉,其实我心想很好,我的休息时间很多。

好了,说正事。

截止上周为止,终于完成了差不多全套的SCM配置(广义的)。具体如下:

  1. 版本控制管理
    1. 使用SVN结合Apache Httpd的WebDAV功能
  2. ISSUE跟踪
    1. 使用JIRA结合SVN插件,可以同步反馈代码变动情况
  3. 构建系统
    1. 使用Apache Maven处理依赖,终于不用在代码库里面包含lib文件了
  4. 继续集成(日构建)服务器
    1. Apache Continuum,完美的与Maven和SVN整合

以上系统通通部署在lazing.vicp.net的域名下。由一个MySQL数据库服务,一个Httpd服务,两个Tomcat服务组成,统一调度到标准http端口。

使用自己的机器做服务器,因为风扇声音太大。所以常常被忍无可忍的关掉。近期想办法解决。

建议七街所有开发项目以及客户服务工作进入系统进行管理(某A,我是给你说的)。当然,这是在服务稳定之后。

除此之外,在软件配置和流程管理方便进行了进一步的实验和探索,如下:

  1. 继续TDD实践的研究
  2. 使用POM的高级功能,使用parent/module的方式来组织项目
  3. 在此基础上设计实现通用模块。目前已经完成common-dao1.4 module第一个版本迭代

下周计划

  1. 实验利用七街论坛进行单点登录的尝试
  2. 基于acegi开发通用安全权限管理系统 common-security module 第一个版本迭代
  3. 学习开源BI套件Pentaho BI Project
  4. 继续深入研究开源工作流与BEA工作流技术

以上,继续无聊的去写文档。