环境准备
本机已安装Maven并配置好环境.
本文大部分参考了博主
阿豪聊干货
的文章原文链接 www.cnblogs.com/hafiz/p/551…
一. 单模块项目
单模块项目目录结构如下图
目录结构详解:
- 根目录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
定义了生成项目值需填写的变量fileSet
中packaged="true"
标识src/main/resources/archetype-resources/src/main/java中对应的内容是否要放入到package中,比如package为com.titian,那么如果该属性为true,则对应的java文件会放到com/titan文件夹下,也就是包路径下.fileSet
中filtered="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
复制代码
二. 多模块项目
多模块项目目录如下图
本演示项目中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
: 定义子模块工程artifactIddir
: 子模块工程源文件在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