上一篇《maven的POM结构》让人晦涩难懂,一看就是拷贝粘贴的,很没意思。忽然想起了《maven的安装使用》,估计看完总有个问题,那个maven genapp里面genapp是怎么回事?你怎么知道后面跟genapp,而不是genBush,genBullshit?先看看maven都支持什么命令行参数,输入maven -h,我们可以看到有一行如下:
-g,--goals Display available goals
我们如法炮制,输入maven -g。救命啊,屏幕发了疯的滚屏,一气输出了725行,(假如对这些输出感爱好,建议你把它输出到文件中仔细观摩,使用命令“maven -g>文件路径”输出到目标文件,然后使用文本编辑器打开就可以了)但是这些输出都是什么呀?
我们看看前八行的输出
1 __ __
2 \/ __ _Apache__ ___
3 \/ / _` \ V / -_) ' \ ~ intelligent projects ~
4 _ _\__,_\_/\_____ v. 1.0
5
6 Available [Plugins] / Goals
7 ===========================
8 genapp ......................... Generate Application based on a template
9 ... ...
原来这个genapp是一个叫做goal的东西,不是“进球”的意思。指的是maven能够执行的任务,虽然名字听起来很有噱头,其实跟Ant里面的Task差不多,而且maven的goal定义里面也可以使用Ant里面的Task定义,就是诸如delete,mkdir,echo之类的Ant的Task,maven也可以照单全收,直接使用。从刚才maven -g我们可以看到maven支持如此众多的goal,也就是说已经替我们定制了一大堆门类齐全的goal供我们使用,甚至包括对JBuilder,Eclipse这样IDE的支持,可以生成它们特定的工程格式。所以maven支持的参数除了预定义的(可以用-h查看)还有就是定义好的goal。
这些goal的定义都在maven的plugins目录里面,我们看到一大堆名字怪诞的jar文件,我们随便
找一个撬开一看,里面一般的文件结构如下:
--<META-INF>
--plugin.jelly
--plugin.properties
--project.properties
--project.XML
--...
其实四个文件里面,只有plugin.jelly和project.xml是必须具备的,最后的省略号是说有的plugin里面还要有相关支持类包或者资源包,资源包通常叫做plugin-resources。这个jelly是Apache的一个项目(怎么又冒出来一个?),不过我们就把它当作普通的xml文件看待就可以了,除非要自制插件,否则很少接触。
有了这么强大的支持,就像编程有了强大丰富的库支持一样,我们可以省心省力了,但是假如我们觉得这些还不够用,或者我们要加点小花样怎么办?
首先要想到的就是----对了,去网上找,找符合要求的插件,SourceForge网站上还专门有一个的 Maven插件的项目,还有maven的主页的插件列表,都是提供插件资源的地方。
假如还是找不到,那就要考虑扩展已有的goal或者自定义goal。在工程文件夹定义一个文件maven.xml,这个文件是专门用来自定义goal的,所以一般工程可以没有这个文件。
文件大致框架如下:
<project xmlns:j="jelly:core">
...
<goal name=...>
...
</goal>
...
<preGoal name=...>
...
</preGoal>
<postGoal name=...>
...
</postGoal>
</project>
注重:文件头部不用<?xml version="1.0" encoding="ISO-8859-1"?>这样的声明。
<goal>标签是用来自定义goal的,扩展goal用<preGoal>和<postGoal>标签,从名字上就可以看出来,<preGoal>要定义 <preGoal name=...>中的name指定的goal在执行前要做的动作。而<postGoal>则是定义相应goal执行后要做的动作。