maven自定义archetype

1.前言
  在工作过程中必然会遇到创建项目的蛋疼事,一个项目包含茫茫多的配置文件。例如:Spring、mybatis、log4j、pom.xml、git等,其他的还包括项目目录骨架。整个过程下来顺利的话几十分钟,如果对公司项目配置不了解的情况下,几个小时都是有可能的。
      maven的强大就不言而喻了,自定义项目骨架主要利用到 archetype插件。在IDE中创建maven项目时,可以选择archetype类型快速创建项目目录。例如最常见的maven-archetype-plugin 的quickstart。maven考虑到通用性,提供的是最简单的目标。
      新建项目时,配置文件往往是从其他项目拷贝过来的,拷贝的问题在于很容易踩坑,并且不容易定位问题。
      利用maven一键生成项目骨架可以解决所有的问题,下面切入正题吧。
 
2.创建模板项目
  模板项目也是一个普通的maven项目,但是其有特定的目录结构即实际使用的项目的目录结构。
  第一步:首先找一个现有原型项目,这里假设原型项目为A项目,A项目具有所有详细的配置信息。
  第二步:改造A项目
    删除A项目里所有特定业务相关的代码、文件。保留最后生成的最小配置文件集合。一般项目里的配置文件包括以下内容:
      • pom.xml的jar包依赖、插件配置,保留最小依赖集
      • Spring、Struts2、mybatis配置  
      • log4j.xml        
  另外还有项目的基本包结构配置,常见的包包括:dao、service、service.impl、util、entity等。
  最好为每个配置文件编写一个demo,并注释掉,这样方便团队其他成员理解和使用。为每个包目录编写一个demo,例如dao层。这样在使用生成的archetype创建项目时,就会生成对应的配置文件和对应的包目录。
  到这步一个项目基本骨架雏形已经成型了,其实在整个过程中这一步是真正我们需要关心的。一个干净、易用的模板才是最好的。
  这里我们称改装后的A项目为A-min(hhyz-archetype-web)项目.
    
  第三步: 在项目的POM文件中增加:
    
<build>
    <finalName>hhyz-archetype-web</finalName>
        <pluginManagement>  
            <plugins>  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-archetype-plugin</artifactId>  
                    <version>2.2</version>  
                </plugin>  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-compiler-plugin</artifactId>  
                    <configuration>  
                        <source>1.5</source>  
                        <target>1.5</target>  
                    </configuration>  
                </plugin>  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-resources-plugin</artifactId>  
                    <configuration>  
                        <encoding>UTF-8</encoding>  
                    </configuration>  
                </plugin>  
            </plugins>  
        </pluginManagement>
</build>

  第四步: 从A-min项目中创建maven骨架项目

    打开CMD进入命令行,在项目根目录里执行: mvn archetype:create-from-project。

    成功执行完之后,在target/generated-sources/ 下有个archetype目录,这个就是生成的 archetype。可以看到这个目录其实就是普通的maven项目,也就是我们最终的骨架模板项目,我们称之为A-template项目。

    有几个目录、文件需要说明:

      • src/main/resources/archetype-resources  通过A-template骨架创建的项目包含的所有的文件和目录都在这个目录下
      • src/main/resource/META-INF/maven/archetype-metadata.xml  此文件是配置文件,告诉archetype插件,archetype-resources里面哪些文件需要包含到创建出的项目里。打开这个文件发现有个fileSets标签,包含一系列的fileSet标签。不难发现fileSet就是对archetype-resources下的资源描述。          

  第五步:改造A-template

    archetype:create-from-project并非完全智能,需要自己稍加修改

      • 修改pom.xml文件

          修改packing的值为jar或者war

      • 修改archetype-metadata.xml
<requiredProperties>
      <requiredProperty key="groupId"/>
      <requiredProperty key="artifactId"/>
      <requiredProperty key="version">
          <defaultValue>1.0.0</defaultValue>
      </requiredProperty>
  </requiredProperties>

          在fileSets同级下增加requiredProperties标签。requiredProperties定义模板项目中一些参数值,内置的参数包括:groupId,artifactId,version,package。自己可以提供这些参数的默认值,也可以增加自己额外的参数。大部分情况下,内置的参数足够用。fileSet标签有一个filtered=“true”属性,表示该fileSet可以使用参数变量。在文件中引用参数变量的方式${参数名},例如${package}.通常生成A-template项目时,archetype插件会扫描A-min所有的文件,把需要替换为参数的地方自动替换。毕竟代码没有那么智能,有些地方会有问题。所以,我们要检查每个文件的参数部分是不是我们预期的。增加参数、删除参数来达到我们的要求。           

  第六步:部署生成的archetype到本地仓库

    cd进入generated-sourced/archetype目录,运行maven命令:mvn clean install,到这里我们的模板骨架项目基本完成。

3.使用自定义的模板创建项目

  方式一:使用命令行

        在自己的workspace下执行  mvn archetype:generate -DarchetypeCatalog=local  -o 
选择刚才的模板项目的编号,按照提示输入参数值。这样项目就创建完毕了。如果找不到我们的模板项目,检查一下~/.m2/目录下是否有archetype-catalog.xml文件。如果没有在A-template的根目录执行一下 
mvn archetype:update-local-catalog -o
 
  方式二:通过IDE创建(推荐)
  
  注:有时候会找不到新加的archetype,重启eclipse就好了。

 

4.部署到公司内部的maven中央仓库
 
     经过反复测试之后,我们的模板项目就可以发布了。把我们的模板项目部署到公司内部的maven仓库。其他团队成员就可以通过方式二使用我们的骨架模板创建项目了。IDE帮我们自动下载模板项目的jar包到本地仓库。方式一则需要自己手动下载 ,在任何一个项目里添加我们的模板项目依赖,执行maven eclipse:eclipse命令,就会下载jar包。方式一比较麻烦,推荐使用方式二,简单易用。

 

 

posted @ 2017-02-22 20:26  Happy-Coder  阅读(5761)  评论(0编辑  收藏  举报