自定义Maven脚手架之archetype

前言:
        Maven是一个优秀且被广泛应用的代码构建工具,采用[约定优先于配置]的原则进行项目管理,在使用Maven创建项目的时候,我们往往会使用Maven内置的项目骨架(即:archetype)来快速生成项目结构;archetype是在maven-archetype-plugin插件执行generate目标的时候进行配置的,我们经常使用到Maven的预置的骨架包括:maven-archetype-webapp、maven-archetype-quickstart等;前者用来快速搭建一个web工程项目,后者用来快速搭建一个普通的java工程项目。
        但是在团队开发的过程中,Maven预置的archetypes可能是并不能很好的满足开发需求,因为不同的业务和开发团队在项目结构上都会有定制化的需求;在这样的背景下我们有必要去定义一个足够 定制的 代码骨架供团队使用,如此一来,团队在往后的开发中就可以利用自定义的Maven骨架一键生成项目结构。

我们来按照官方文档来创建一个自己的单模块脚手架(archetype)

官方文档地址: http://maven.apache.org/guides/mini/guide-creating-archetypes.html

创建archetype项目结构

1.我的archetype结构:

图A.archetype目录结构
src/main/resources 这个是Maven规定的目录结构,只是不再有 src/main/java 或者 src/test , 所有和骨架模板相关的配置,都是写在 src/main/resources目录下
即:按照这个骨架创建出来的项目,默认是如下图B结构,和上图A中src/main/resources/archetype-resources 下面的结构一致:
图B.骨架生成项目默认目录结构

2.按照需求配置archetype项目

要按照配置并发布骨架,主要是配置这几个部分:

  1. 主目录下的pom.xml文件
  2. src/main/resources/archetype-resources //下面的目录和文件就是真正想要使用骨架创建的项目的结构,根据需求进行布置
  3. 在src/main/resources/META-INF/maven/archetype-metadata.xml //配置相关的元数据描述信息,即告知骨架如何编译
1)主目录下的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 定义自己的脚手架元信息 -->
    <groupId>com.fh.archetypes</groupId>
    <artifactId>fh-framework-archetype</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>FhFrameworkArchetype</name>
    <!-- 设置发布脚手架的Maven仓库地址 -->
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>FH Release Repository</name>
            <url>http://***/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>FH Snapshot Repository</name>
            <url>http://***/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    <!-- 作者及机构信息 -->
    <developers>
        <developer>
            <id>flyTiger</id>
            <name>LFH</name>
            <email>xxx.com.cn</email>
            <url>http://www.fh.com</url>
            <organization>FH</organization>
            <roles>
                <role>user</role>
                <role>developer</role>
            </roles>
            <timezone>-6</timezone>
        </developer>
    </developers>
</project>
2)src\main\resources\META-INF\maven\archetype-metadata.xml
<archetype-descriptor xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
                      name="FH-Utils-archetype" partial="FH-Utils-archetype">
    <!-- 创建项目时的参数 -->
    <requiredProperties>
        <requiredProperty key="groupId" >
        <!-- 默认值 -->
            <defaultValue>com.fh</defaultValue>
        </requiredProperty>
        <requiredProperty key="artifactId" />
        <requiredProperty key="version">
            <defaultValue>1.0.0</defaultValue>
        </requiredProperty>

        <requiredProperty key="appName">
            <defaultValue>FH</defaultValue>
        </requiredProperty>
    </requiredProperties>

    <!-- 骨架要编译的目录 -->
    <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
        <!-- 不进行模板解析,因为有程序中默认包含的模板文件此时不能进行解析操作 -->
        <fileSet filtered="false" encoding="UTF-8">
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>src/main/webapp/WEB-INF</directory>
            <includes>
                <include>*.*</include>
            </includes>
        </fileSet>
        <!-- 这几个目录不进行模板解析 (静态资源或程序中其它模板)-->
        <fileSet filtered="false" encoding="UTF-8">
            <directory>src/main/webapp</directory>
            <includes>
                <include>ftl/**/*.*</include>
                <include>html/**/*.*</include>
                <include>static/**/*.*</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <directory>src/test/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
        <fileSet filtered="false" encoding="UTF-8">
            <directory>src/test/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </fileSet>
    </fileSets>

</archetype-descriptor>
3)src\main\resources\archetype-resources\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 这里就是标准Maven项目中pom.xml的配置了 -->
    <parent>
        <groupId>com.fh</groupId>
        <artifactId>fh-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <!-- 这里会从创建项目中配置的参数中读取 -->
    <artifactId>${artifactId}</artifactId>
    <packaging>war</packaging>
    <name>${artifactId}</name>
    <url>http://www.fh.com/</url>
    <!-- 引入项目中必然要引入的依赖项 -->
    <dependencies>
        <dependency>
            <groupId>-</groupId>
            <artifactId>-</artifactId>
            <version>-</version>
        </dependency>
           <!-- ... -->
    </dependencies>
<!-- 项目构建插件配置 -->
    <build>
        <finalName>/${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <attachClasses>true</attachClasses>
                    <classesClassifier>api</classesClassifier>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
4) 小TIP

    在src/main/java这个目录下的java文件中的package可以引用${package}变量 如:

安装并发布自定义的脚手架

    使用mvn clean install将脚手架安装到本地仓库,或者 mvn depoly 命令打包发布脚手架到远程仓库
现在就可以愉快的使用自已的脚手架来快速创建符合团队需求的项目结构了

官方文档地址: http://maven.apache.org/guides/mini/guide-creating-archetypes.html


 上一篇
HTML 特殊转义字符对照 HTML 特殊转义字符对照
HTML 特殊转义字符 对照表 字符 十进制 转义字符 字符 十进制 转义字符 “ &#34; &quot; ? &#161; &iexcl; & &#38
2019-04-21
下一篇 
Maven 私库的搭建 Maven 私库的搭建
前言: Maven私服(即Repository Manager)的主要作用: 方便内部人员发布内部使用的依赖; 方便存放官方仓库中没有的第三方依赖包; 减少从中央仓库下载的次数,节省带宽、提高maven build的效率; 减少对中央仓
2019-04-16
  目录