手写Maven自定义Archetype工程

环境准备

本机已安装Maven并配置好环境.

本文大部分参考了博主 阿豪聊干货 的文章原文链接 www.cnblogs.com/hafiz/p/551…

一. 单模块项目

单模块项目目录结构如下图

v2-c9692d9addd9ffb2b758fe571342be37_720w (1).jpg

目录结构详解:

  • 根目录single-archetype/pom.xml和一般Maven项目一样,用于定义骨架项目坐标信息.在通过骨架项目生成指定项目时使用.
  • 项目骨架内容集中在src/mian/resource/archetype-resources文件夹中.
  • archetype-resources中的pom.xml定义了待生成项目的pom文件的内容,/src/main/java等目录中分别定义了待生成项目中相应目录下的内容.
  • 在src/main/resources/META-INF/maven/archetype-metadata.xml中定义相关的元数据描述(其中该文件的位置固定为resources/META-INF/maven文件夹下,且名称固定为archetype-metadata.xml)

1. single-archetype/pom.xml参考内容如下

<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.titian</groupId>
    <artifactId>single-archetype</artifactId>
    <version>1.1</version>
    <packaging>jar</packaging>

    <name>single-archetype</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
    </dependencies>
    <build>
        <finalName>single-archetype</finalName>
    </build>
</project>
复制代码

2. src/main/resources/archetype-resources/pom.xml内容如下

<?xml version="1.0"?>
<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>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>
    <name>${artifactId}</name>

    <dependencies>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-archetype-plugin</artifactId>
                    <version>3.2.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
复制代码

pom.xml文件说明

  • 文件中${xxx}标识的变量可以通过Maven中的命令行传进来的,如: mvn archetype:generate -DgroupId=com.titian. 也可以通过 archetype-metadata.xml 文件中配置动态属性

3. src/main/resources/META-INF/maven/archetype-metadata.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor  name="beast-archetype"
                       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">

    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.titian</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="true" encoding="UTF-8">
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <directory>src/test/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
        <fileSet encoding="UTF-8">
            <directory>src/test/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </fileSet>
    </fileSets>
</archetype-descriptor>
复制代码

archetype-metadata.xml文件说明

  • requiredProperty定义了生成项目值需填写的变量
  • fileSetpackaged="true"标识src/main/resources/archetype-resources/src/main/java中对应的内容是否要放入到package中,比如package为com.titian,那么如果该属性为true,则对应的java文件会放到com/titan文件夹下,也就是包路径下.
  • fileSetfiltered="true"标识该目录下面文件中的${xxx}将会被替换为指定变量

4. src/main/resources/archetype-resources/src/main/java/Demo.java内容如下

package ${package};

public class Demo{
    public static void main( String[] args )
    {
        System.out.println( "Hello My Archetype!" );
    }
}
复制代码

5. 安装到本地仓库,并使用

  • 安装: 在singele-archetype根目录打开cmd,执行 mvn clean install
  • 使用: 在任意空目录中打开cmd,执行
mvn archetype:generate -DgroupId=com.titian -DartifactId=single-archetype -Dpackage=com.titian -DarchetypeGroupId=com.titian -DarchetypeArtifactId=single-archetype -DarchetypeVersion=1.1 -DarchetypeCatalog=local
复制代码

二. 多模块项目

多模块项目目录如下图

v2-c9692d9addd9ffb2b758fe571342be37_720w (1).jpg

本演示项目中xxx-starter-parent子模块才是真正的父工程.

多模块项目与单模块项目区别不大,但是有几个概念需要说明

  • __rootArtifactId__${rootArtifactId}占位符会被parent项目artifactId替换
  • src/main/resources/archetype-resources里必须要有一个顶级pom文件,同时子文件夹代表了模块定义

1. src/main/resources/META-INF/maven/archetype-metadata.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="beast-archetype"
                      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">

    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.titian.parent</defaultValue>
        </requiredProperty>
        <requiredProperty key="project">
            <defaultValue>demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="moduleName">
            <defaultValue>demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="package">
            <defaultValue>com.titian.demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="version">
            <defaultValue>1.0.0-SNAPSHOT</defaultValue>
        </requiredProperty>
    </requiredProperties>

    <modules>
        <module id="${rootArtifactId}-biz-root" name="${rootArtifactId}-biz-root" dir="__rootArtifactId__-biz-root">
            <modules>
                <module id="${moduleName}-biz" name="${moduleName}-biz" dir="modules/__moduleName__-biz">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-model-root" name="${rootArtifactId}-model-root" dir="__rootArtifactId__-model-root">
            <modules>
                <module id="common-model" name="common-model" dir="modules/common-model">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-plugin-root" name="${rootArtifactId}-plugin-root" dir="__rootArtifactId__-plugin-root">
            <modules>
                <module id="${moduleName}-plugin-script" name="${moduleName}-plugin-script" dir="modules/__moduleName__-plugin-script">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-provider-base-root" name="${rootArtifactId}-provider-base-root"
                dir="__rootArtifactId__-provider-base-root">
            <modules>
                <module id="provider-${moduleName}-api" name="provider-${moduleName}-api" dir="modules/provider-__moduleName__-api">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
                <module id="provider-${moduleName}-client" name="provider-${moduleName}-client" dir="modules/provider-__moduleName__-client">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-provider-root" name="${rootArtifactId}-provider-root" dir="__rootArtifactId__-provider-root">
            <modules>
                <module id="provider-${moduleName}" name="provider-${moduleName}" dir="modules/provider-__moduleName__">
                    <fileSets>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet filtered="true" encoding="UTF-8" packaged="true">
                            <directory>src/test/java</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                        <fileSet encoding="UTF-8">
                            <directory>src/test/resources</directory>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                        </fileSet>
                    </fileSets>
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-starter-parent" name="${rootArtifactId}-starter-parent" dir="__rootArtifactId__-starter-parent">
        </module>
    </modules>
</archetype-descriptor>
复制代码
  • 属性变量定义
    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.titian.parent</defaultValue>
        </requiredProperty>
        <requiredProperty key="project">
            <defaultValue>demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="moduleName">
            <defaultValue>demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="package">
            <defaultValue>com.titian.demo</defaultValue>
        </requiredProperty>
        <requiredProperty key="version">
            <defaultValue>1.0.0-SNAPSHOT</defaultValue>
        </requiredProperty>
    </requiredProperties>
复制代码

这些属性可以在资源元文件里的任意一个文件里通过${xxxx}来引用,所有元文件最终都可以选择通过velocity引擎来执行替换后生成.默认的属性有:groupId, artifactId, packeage, version等,也可以自定义属性如: project, moduleName

  • 项目子模块定义
<modules>
        <module id="${rootArtifactId}-biz-root" name="${rootArtifactId}-biz-root" dir="__rootArtifactId__-biz-root">
            <modules>
                <module id="${moduleName}-biz" name="${moduleName}-biz" dir="modules/__moduleName__-biz">
                    ...
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-model-root" name="${rootArtifactId}-model-root" dir="__rootArtifactId__-model-root">
            <modules>
                <module id="common-model" name="common-model" dir="modules/common-model">
                    ...
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-plugin-root" name="${rootArtifactId}-plugin-root" dir="__rootArtifactId__-plugin-root">
            <modules>
                <module id="${moduleName}-plugin-script" name="${moduleName}-plugin-script" dir="modules/__moduleName__-plugin-script">
                    ...
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-provider-base-root" name="${rootArtifactId}-provider-base-root"
                dir="__rootArtifactId__-provider-base-root">
            <modules>
                <module id="provider-${moduleName}-api" name="provider-${moduleName}-api" dir="modules/provider-__moduleName__-api">
                    ...
                </module>
                <module id="provider-${moduleName}-client" name="provider-${moduleName}-client" dir="modules/provider-__moduleName__-client">
                    ...
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-provider-root" name="${rootArtifactId}-provider-root" dir="__rootArtifactId__-provider-root">
            <modules>
                <module id="provider-${moduleName}" name="provider-${moduleName}" dir="modules/provider-__moduleName__">
                   ...
                </module>
            </modules>
        </module>
        <module id="${rootArtifactId}-starter-parent" name="${rootArtifactId}-starter-parent" dir="__rootArtifactId__-starter-parent">
        </module>
    </modules>
复制代码

module属性说明如下:

  • id: 定义子模块工程artifactId
  • dir: 子模块工程源文件在archetype-resources里对应的文件夹名称,可自定义如__project__
  • name: 子模块工程名称

2. 子模块pom.xml文件定义如下(以biz模块为例子)

<?xml version="1.0"?>
<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>
    <parent>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}-starter-parent</artifactId>
        <version>${version}</version>
        <relativePath>../${rootArtifactId}-starter-parent/pom.xml</relativePath>
    </parent>

    <artifactId>${artifactId}</artifactId>
    <name>${artifactId}</name>
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <fork>true</fork>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <fork>true</fork>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
复制代码

3.子模块modules/pom.xml文件定义如下(以biz模块为例子)

<?xml version="1.0"?>
<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>
    <parent>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}-starter-parent</artifactId>
        <version>${version}</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>

    <artifactId>${artifactId}</artifactId>
    <name>${artifactId}</name>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>    
复制代码

4. 安装到本地仓库,并使用

可参考 单模块项目 的安装和使用

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享