【Maven 实战技巧】「插件使用专题」Maven-Archetype 插件创建自定义 maven 项目骨架
技术推荐
自定义 Archetype Maven 骨架/以当前项目为模板创建 maven 骨架,可以参考http://maven.apache.org/archetype/maven-archetype-plugin/advanced-usage.html,详细介绍了如何快速创建和使用 Archetype。
技术背景
在工作过程中必然会遇到创建项目的蛋疼事,一个项目包含茫茫多的配置文件。例如:Spring、mybatis、log4j、pom.xml、git 等,其他的还包括项目目录骨架。整个过程下来顺利的话几十分钟,如果对公司项目配置不了解的情况下,几个小时都是有可能的。
maven 的强大就不言而喻了,自定义项目骨架主要利用到 archetype 插件。在 IDE 中创建 maven 项目时,可以选择 archetype 类型快速创建项目目录。例如最常见的 maven-archetype-plugin 的 quickstart。maven 考虑到通用性,提供的是最简单的目标。
新建项目时,配置文件往往是从其他项目拷贝过来的,拷贝的问题在于很容易踩坑,并且不容易定位问题。利用 maven 一键生成项目骨架可以解决所有的问题。
什么是 Archetype
Archetype 原型是一个 Maven 项目模板工具包。一个原型被定义为从其中相同类型的所有其它事情是由一个原始图案或模型。名称配合,因为我们正在努力提供一种系统,该系统提供了一种生成 Maven 项目的一致的手段。原型将帮助作者为用户创建 Maven 项目模板,并为用户提供了手段,产生的这些项目模板参数化的版本。
使用原型提供了一个很好的方式,迅速使开发人员在与您的项目或组织采用最佳实践一致的方法。在 Maven 的项目中,我们使用原型,试图让我们的用户和运行尽可能快地通过提供展示许多的 Maven 的功能,同时引入新的用户通过采用 Maven 的最佳实践的示例项目。在几秒钟内一个新的用户可以有一个工作 Maven 项目作为跳板用于调查更多的功能,Maven 中。我们也试图使原型机制添加剂和由我们的意思是允许一个项目的一部分被捕获在一个原型,使得项目的部件或方面可以被添加到现有的项目。这方面的一个很好的例子是 Maven 站点原型。如果,例如,您使用的快速启动原型生成一个工作项目,你可以迅速通过使用现有项目中的网站原型创建网站的项目。你可以做这样的事与原型。
您可能要在组织内部规范 J2EE 开发,所以你可能要提供原型为 EJB,或者,或者您的 Web 服务的战争。一旦这些原型创建和部署在您的组织的资源库,他们都可以在组织内使用的所有开发人员。
上面是我根据 maven 官网在百度翻译出来的,大家将就着看,大概意思就是 archetype 是 Maven 项目模板工具包,也就是一个模板工程。
创建自定义的 archetype 项目
使用过 Maven 的人都知道 maven 中有许多功能都是通过插件来提供的,其中的一个插件:maven-archetype-plugin,通过该插件可以自定义符合我们自己需求的 archetype。
创建的 maven project 的 pom.xml 文件中添加 archetype 插件
进入该 project 的根目录,执行 mvn 命令 mvn archetype:create-from-project.
如果用 IDEA 可以采用:
成功执行完之后,在 target/generated-sources/ 下有个 archetype 目录,这个就是生成的 archetype。可以看到这个目录其实就是普通的 maven 项目,也就是我们最终的骨架模板项目,我们称之为 template 项目。
有几个目录、文件需要说明:
src/main/resources/archetype-resources:通过 template 骨架创建的项目包含的所有的文件和目录都在这个目录下
src/main/resource/META-INF/maven/archetype-metadata.xml 此文件是配置文件,告诉 archetype 插件,archetype-resources 里面哪些文件需要包含到创建出的项目里。打开这个文件发现有个 fileSets 标签,包含一系列的 fileSet 标签。不难发现 fileSet 就是对 archetype-resources 下的资源描述。
改造 template
archetype:create-from-project 并非完全智能,需要自己稍加修改
修改 pom.xml 文件
修改 packing 的值为 jar 或者 war
修改 archetype-metadata.xml
在 fileSets 同级下增加 requiredProperties 标签。
requiredProperties 定义模板项目中一些参数值,内置的参数包括:
groupId
artifactId
version
package
自己可以提供这些参数的默认值,也可以增加自己额外的参数。大部分情况下,内置的参数足够用。
fileSet 标签有一个 filtered=“true”属性,表示该 fileSet 可以使用参数变量。
在文件中引用参数变量的方式{package}
通常生成 template 项目时,archetype 插件会扫描所有的文件,把需要替换为参数的地方自动替换。毕竟代码没有那么智能,有些地方会有问题。所以,我们要检查每个文件的参数部分是不是我们预期的。增加参数、删除参数来达到我们的要求。
部署生成的 archetype 本地仓库
execute(create-from-project)之后,在 target 文件夹下,生成骨架模板,如下:
修改工作目录为 骨架所在的目录,然后执行 install 命令:
cd 进入 generated-sourced/archetype 目录,运行 maven 命令:mvn clean install,到这里我们的模板骨架项目基本完成。
或者采用 idea:
此时,可以在 maven 仓库中看到,已经生成好的骨架模板:
这个 xml 文件记录了骨架的信息,一会要用到!
执行 archetype:crawl 命令
路径无所谓,命令: archetype:crawl
IDEA:可以采用
执行完毕后,在 maven 根目录下会生成 archetype-catalog.xml 文件。
这个文件记录 用户自定义骨架的信息。
archetype-catalog.xml 的内容
部署到 maven 私服
修改 archetype 目录下的 pom.xml 文件添加配置
配置 maven 里面的 settings.xml 文件
的 settings.xml 文件配置如下,配置好以后就可以执行发布命令了
注意:此处的配置,id 要与 setting.xml 中的 server 标签中的 id 一致。
上传到 maven 私服中
cd 进入 generated-sourced/archetype 目录,运行 maven 命令:
mvn clean install
mvn deploy
成功后即可在 maven 私服中查看到该模板
使用原型创建新项目
任意目录下执行
添加 IDEA
点击 Add Archetype
对应填写好 如果放在私服中就要在 Reposytory 中写上私服路径 这样就可以用了,
删除自定义骨架
如果这个骨架不合适需要删除骨架,找到 IntelliJ IDEA 的骨架配置文件,大概就是这个位置: C:\Users{version}\system\Maven\Indices
这里面有个文件 UserArchetypes.xml
然后…你就可以删除它了.. 可以删除这一条, 也可以删除整个文件, 然后重启 IDEA , 你就会发现删除成功!
参考:
http://www.colorfuldays.org/tag/archetype/
http://maven.apache.org/archetype/maven-archetype-plugin/
http://maven.apache.org/archetype/maven-archetype-plugin/advanced-usage.html
http://maven.apache.org/archetype/maven-archetype-plugin/create-from-project-mojo.html
http://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html
http://maven.apache.org/archetype/maven-archetype-plugin/examples/generate-batch.html
http://maven.apache.org/archetype/maven-archetype-plugin/specification/generate.html
http://maven.apache.org/archetype/maven-archetype-plugin/specification/archetype-catalog.html
版权声明: 本文为 InfoQ 作者【浩宇天尚】的原创文章。
原文链接:【http://xie.infoq.cn/article/4672c20daa63fd7f0ec80130e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论