随笔-95  评论-31  文章-10  trackbacks-0
maven其实也很笨重繁琐,还是避免不了xml的各种配置,相比较gradle更灵活简洁,但公司不会让人这么灵活构建项目。不废话了,进入主题。
现在开发中,一个项目基本都是分模块开发,一个模块一个project,然后一起管理所有模块,虽然maven已经提供了不少archetype,生成基本的项目结构,但感觉有时候还是不太满足自己的需求,有些jar或许用不到,整体模块架构目录结构以及依赖不是自己想要的,这个时候自定义archetype就能派上用场。
    自定义开发archetype,首先得明确两个概念,maven的聚合和继承,聚合是为了管理多模块build,继承是为了管理依赖,这里的需求是自动构建一个父模块,以及多个子模块,同时父模块既是聚合也可继承依赖。

步骤一:创建一个maven工程,结构中只需要个src/main/resources目录以及一个简单的pom.xml,pom中packaging类型为jar即可,如图:


步骤二:src/main/resources目录下面必须包含两个目录:archetype-resources和META-INF/maven/archetype-metadata.xml,如图:

说明:archetype-resources目录是用来存放将来生成的项目结构是什么,如上图所示有两个工程module-service和web以及一个父pom.xml,这个完全依据你的需求写,META-INF/maven/archetype-metadata.xml是用来描述如何生成项目结构。

步骤三:描述archetype-metadata.xml 可参考http://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html
里面只有三个元素标签<requiredProperties/>、<fileSets/>、<modules/> 如图:

其实只要明白archetype-resources目录和这个xml描述相对应,这里的<requiredProperty/><fileSets/><modules/>就很好理解
1:<requiredProperty/>创建工程用户必填内容,用于Velocity templates替换,只要<fileSet>标签的filtered为true,即可表明该fileSet包含的文件内容都进行替换,比如每个子模块的artifactId都不一样,即可在pom里面<artifactId>${module-artifactId}</artifactId>,这里的值即可替换成用户输入的值。
2:这里根标签下的<fileSets/>对应archetype-resources根目录。
3:<modules/>对应archetype-resources根目录下面的module-service和web目录。
4:<module/>又可包含fileSet标签,描述子模块的项目结构。
5:对于多模块开发来说,maven会采用默认的父子模块目录结构,所以这里根标签下的<fileSets/>没有必要存在,删除即可,因为只要在archetype-resources根目录下有一个pom.xml,将来生成的父子模块目录结构,父目录下会自动包含该pom文件。

再看archetype-resources目录下的子模块如图:


提示:
1:子模块包含的目录结构是将来生成工程后会包含的目录,里面仍然会用到Velocity templates(需要在archetype-metadata.xml中子模块的fileSet标签里设置元素filtered="true",如果还需要生成包那么packaged="true"即可),比如每个类会有包名那么这样写:package ${package}.xxx,因为包名一般采用groupId.artifactId的格式,也即用户输入的内容,用${package}即可替换成包名。
如图:

2:子模块中建立的包如src/main/java下面,api、entity、services等见上上图~,无需添加根包名,因为maven会根据groupId.artifactId自动生成包名,也即如果fileSet标签的元素packaged="true"且包下面存在java类文件,那么api、entity、services等会默认生成在该groupId.artifactId包下面。
3:子模块module-service继承父pom(archetype-resources根目录下的pom.xml)的依赖,无需在子模块里面添加<parent/>标签,因为maven默认会认为子模块继承父pom的依赖, 会自动加入<parent/>标签,如图:



无需添加<parent/>标签,生成工程后,会自动添加。

至此一切完毕,然后运行mvn clean install即可将该archetype安装到本地仓库,在控制台输入mvn archetype:generate -DarchetypeCatalog=local选择你的archetype即可以交互方式生成工程,如果有错误,控制台会提示,按错排除即可。
用eclipse也可安装,点击maven project-->next-->Catalog选择Default Local-->Add Archetype-->输入该archetype的groupId、artifactId、version确定即可出现。

posted on 2015-02-12 00:43 朔望魔刃 阅读(2165) 评论(0)  编辑  收藏 所属分类: maven

只有注册用户登录后才能发表评论。


网站导航: