一、创建自己的archetype一般有两种方式,比较简单的就是create from project
1.1、首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应的目录下面
比如说会将一些常用的java代码存放到src/main/java目录下面;
会将一些通用的配置文件放到src/main/resources目录下面;
如果是javeEE工程,还会有一些jsp等等的文件存放到src/main/webapp目录下面
1.2、然后在maven project的pom.xml文件中添加插件
================================================
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
================================================
1.3、打开cmd窗口,cd到刚才创建的maven project的根目录,运行maven命令:
mvn archetype:create-from-project
然后会在target目录下面生成generated-sources目录,这个就是生成的 archetype
1.4、cd进入generated-sourced/archetype目录,运行maven命令:
mvn install
这样就把自定义的archetype安装到本地仓库了。
archetype安装的地址是在maven安装目录下面的conf/settings.xml文件中指定的(<localRepository>字节)。
默认会在 ~/.m2 目录下面生成一个archetype-catalog.xml文件(和默认的settings.xml在同一个目录),
声明了该archetype的groupId、artifactId和其他属性。
因为Eclipse创建maven项目过程中,选择的“Default Local”指向的地址就是 ~/.m2,
所以文件archetype-catalog.xml会被eclipse自动读取,
使用eclipse创建maven项目的时候可以在"Default Local"一项中找到刚才自定义archetype名字。
1.5、如果想要卸载刚才安装的archetype,只需要将~/.m2目录下面的archetype-catalog.xml文件中对应的<archetype>字节段删掉,
并且把本地仓库中相应groupId和artifactId下面的文件删掉就可以了。
1.6、安装到本地仓库中的archetype只可以被自己使用,如果想要共享,那么在第四步的时候使用deploy命令,不要使用install命令。
直接使用archetype:create-from-project比起手工去打造一个archetype要便捷的多,但, 有时候偷懒会有些不靠谱,archetype:create-from-project的某些行为可能会与我们最初的设想有出入,这个时候就需要我们在最终发布新创建的archetype之前,做有些后继处理,比如:
对于要包含到archetype的Java代码文件来说, archetype:create-from-project之后, Java代码文件原来的package结构会被忽略掉,比如,对于如下类来说:
cn.spring21.app.defaults.controller.QuickStartController
当archetype:create-from-project之后, archetype中对应的文件就变成了:
QuickStartController
这显然不是我们想要的结果(当然,对于不在乎这一结构的archetype来说则无所谓),为此,我们要对archetype:create-from-project之后生成的结果文件进行定制。
首先, 我们编辑文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml,它记载了archetype里都包含哪些文件和目录结构,将如下内容:
Xml代码
1. <sources>
2. <source>src/main/java/QuickStartController.java</source>
3. </sources>
变更为:
Xml代码
1. <sources>
2. <source>src/main/java/cn/spring21/app/defaults/controller/QuickStartController.java</source>
3. </sources>
然后,将以上文件和目录结构创建或者Copy到如下目录:
target/generated-sources/archetype/src/main/resources/archetype-resources/src/main/java
所有这些做完之后,Java源代码文件结构就可以保持了。
虽然想要的Java源代码目录结构可以保持住了,不过, 还会有一个烦人的地方,如果我们在使用这个archetype创建新的project的时候,不明确指定packageName,那maven会“自作多情”的把groupId作为Java文件的package,前缀到原来的package前面。比如, 如果我原来java文件对应:
cn/spring21/app/defaults/controller/QuickStartController.java
而创建项目的时候, 指定“-DgroupId=cn.spring21”,那么,最后生成的项目中, 对应的Java文件就跑到了“cn/spring21/cn/spring21/app/defaults/controller/QuickStartController.java”,stupid哈
要解决这个问题, 可以在使用archetype创建project的时候,明确将packageName指定为空:
mvn archetype:create -DarchetypeGroupId=archetypeGroupId-DarchetypeArtifactId=archetypeArtifactId-DarchetypeVersion=0.0.2-SNAPSHOT -DgroupId=cn.spring21-DartifactId=sample -Dversion=0.0.1-SNAPSHOT -DpackageName=
唯一不爽的就是命令行实在实在太长了。
有时候, archetype:create-from-project会把一些不必要的文件和目录结构也包含到最终的archetype中, 我们可以通过编辑文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml来清理这些不必要包含的文件和目录结构。
比方说,如果我们是使用EclipseIDE来搭建要做成archetype的project的话,一些EcilpseIDE特有的文件和目录,比如.settings目录啦,.classpath/.project文件啦,都会被copy到archetype的目录下,这时候,我们就可以把archetype-metadata.xml文件中对应这些文件和目录的<fileset>元素删除掉来清理它们。
如果某些二进制文件要包含到archetype当中, 比如, 常见的图片文件, 我们需要编辑archetype.xml文件中对应这些文件的<resource>元素配置,为这些元素添加filtered="false"的属性, 否则的话,当使用这个archetype来创建新的工程的时候,这些二进制文件就会“废废”了,原因嘛,还是因为maven太“自作多情”,呵呵,居然把图片当Velocity模板来看待。