使用maven3 创建自定义的archetype

、创建自己的archetype一般有两种方式,比较简单的就是create from project

1.1、首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应的目录下面
    
比如说会将一些常用的java代码存放到src/main/java目录下面;
    
会将一些通用的配置文件放到src/main/resources目录下面;

    如果是javeEE工程,还会有一些jsp等等的文件存放到src/main/webapp目录下面

 

1.2、然后在maven projectpom.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.4cd进入generated-sourced/archetype目录,运行maven命令:
    
mvn install
    这样就把自定义的archetype安装到本地仓库了。

archetype安装的地址是在maven安装目录下面的conf/settings.xml文件中指定的(<localRepository>字节)
    默认会在  ~/.m2  目录下面生成一个archetype-catalog.xml文件(和默认的settings.xml在同一个目录),
    声明了该archetypegroupIdartifactId和其他属性。
    因为Eclipse创建maven项目过程中,选择的“Default Local”指向的地址就是 ~/.m2
    所以文件archetype-catalog.xml会被eclipse自动读取,
    使用eclipse创建maven项目的时候可以在"Default Local"一项中找到刚才自定义archetype名字。

1.5、如果想要卸载刚才安装的archetype,只需要将~/.m2目录下面的archetype-catalog.xml文件中对应的<archetype>字节段删掉,
    并且把本地仓库中相应groupIdartifactId下面的文件删掉就可以了。

1.6、安装到本地仓库中的archetype只可以被自己使用,如果想要共享,那么在第四步的时候使用deploy命令,不要使用install命令。

 

二、可能遇到的一些问题

直接使用archetype:create-from-project比起手工去打造一个archetype要便捷的多,但, 有时候偷懒会有些不靠谱,archetype:create-from-project的某些行为可能会与我们最初的设想有出入,这个时候就需要我们在最终发布新创建的archetype之前,做有些后继处理,比如:

2.1. Java文件对应的package被忽略

对于要包含到archetypeJava代码文件来说, 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=

唯一不爽的就是命令行实在实在太长了。

2.2. 多余文件的清理

有时候, archetype:create-from-project会把一些不必要的文件和目录结构也包含到最终的archetype中, 我们可以通过编辑文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml来清理这些不必要包含的文件和目录结构。

比方说,如果我们是使用EclipseIDE来搭建要做成archetypeproject的话,一些EcilpseIDE特有的文件和目录,比如.settings目录啦,.classpath/.project文件啦,都会被copyarchetype的目录下,这时候,我们就可以把archetype-metadata.xml文件中对应这些文件和目录的<fileset>元素删除掉来清理它们。

2.3. 二进制文件的损坏

如果某些二进制文件要包含到archetype当中, 比如, 常见的图片文件, 我们需要编辑archetype.xml文件中对应这些文件的<resource>元素配置,为这些元素添加filtered="false"的属性, 否则的话,当使用这个archetype来创建新的工程的时候,这些二进制文件就会废废了,原因嘛,还是因为maven自作多情,呵呵,居然把图片当Velocity模板来看待。

你可能感兴趣的:(maven,ArcheType)