本文主要是介绍【maven】多子模块maven模板工程archetype创建过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近项目里需要创建一个多模块(子工程)的模板项目,所以研究了一下maven的archetype plugin。
创建了一个包含多个子模块工程的项目模板。记录下过程。
一个模板工程任务就是创建一个或多个默认的工程,并为每个工程填充好默认的一些文件和配置。同时要抽象出生成的工程需要的一些属性,做到这些属性可动态配置。
- mvn archetype:generate
servicearchetype 工程总体结构
模板工程主要分为两个部分:
1.模板工程定义资源元文件
这些元文件是生成工程的时候需要用到的。放在src/main/resources/archetype-resources里。这里面的文件是生成模板工程是需要用到的元文件,一般也就是生成项目是默认填充的一些文件。
src/main/resources/archetype-resources里必须要有一个顶级pom文件(如果是单工程就是工程pom文件),同时子文件夹代表了模块定义。
这些文件可以写成velocity模板语法,在文件里使用一些变量,在生成文件的时候,可以选择通过velocity引擎渲染生成。
如以上例子里的src/main/resources/archetype-resources/common/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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>${groupId}</groupId>
- <artifactId>${appName}.${artifactId}</artifactId>
- <version>${version}</version>
- <name>${appName}.${artifactId}</name>
- <dependencies>
- </dependencies>
- </project>
可以看到里面使用到了groupId,appName,artifactId等变量,这些变量在生成项目文件的时候会通过vilocity引擎进行替换。至于这些变量定义在哪里,可以看下一部分工程描述文件。
可以根据自己项目的类型和需要,定义任意的资源元文件,如java,xml,MANIFEST.MF等等。
2.模板工程定义描述文件META-INF/maven/archetype-meatdata.xml
有了工程定义元文件还不够。还需要一个东西来描述需要生成工程的结构和文件组成等等,这里可以通过archetype工程定义描述符来定义。
该文件是具体的生成工程规则的描述符。关于工程定义描述文件可以参考maven的官方文档:archetype-descriptor
如下是我写的工程定义描述:
- <?xml version="1.0" encoding="UTF-8"?>
- <archetype-descriptor name="servicearchetype">
- <requiredProperties>
- <requiredProperty key="appName">
- <defaultValue>helloworld</defaultValue>
- </requiredProperty>
- <requiredProperty key="groupId">
- <defaultValue>com.alibaba.china.app</defaultValue>
- </requiredProperty>
- <requiredProperty key="artifactId">
- <defaultValue>helloworld</defaultValue>
- </requiredProperty>
- <requiredProperty key="package">
- <defaultValue>com.alibaba.china.app</defaultValue>
- </requiredProperty>
- </requiredProperties>
- <modules>
- <module id="service.common" dir="common" name="service.common">
- <fileSets>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.java</include>
- <include>**/*.txt</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/test/java</directory>
- <includes>
- <include>**/*.java</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/test/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8">
- <directory></directory>
- <includes>
- <include>pom.xml</include>
- </includes>
- </fileSet>
- </fileSets>
- </module>
- <module id="service.core" dir="core" name="service.core">
- <fileSets>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.java</include>
- <include>**/*.txt</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/test/java</directory>
- <includes>
- <include>**/*.java</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/test/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8">
- <directory></directory>
- <includes>
- <include>pom.xml</include>
- </includes>
- </fileSet>
- </fileSets>
- </module>
- <module id="service.dal" dir="dal" name="service.dal">
- <fileSets>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.java</include>
- <include>**/*.txt</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/test/java</directory>
- <includes>
- <include>**/*.java</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/test/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8">
- <directory></directory>
- <includes>
- <include>pom.xml</include>
- </includes>
- </fileSet>
- </fileSets>
- </module>
- <module id="service.deploy" dir="deploy" name="service.deploy">
- <fileSets>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8">
- <directory></directory>
- <includes>
- <include>pom.xml</include>
- </includes>
- </fileSet>
- </fileSets>
- </module>
- <module id="service.refrence" dir="refrence" name="service.refrence">
- <fileSets>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.java</include>
- <include>**/*.txt</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/test/java</directory>
- <includes>
- <include>**/*.java</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8" packaged="false">
- <directory>src/test/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </fileSet>
- <fileSet filtered="true" encoding="UTF-8">
- <directory></directory>
- <includes>
- <include>pom.xml</include>
- </includes>
- </fileSet>
- </fileSets>
- </module>
- </modules>
- </archetype-descriptor>
工程描述定义是个xml文件,符的几个重要标签定义解释如下
1.属性变量定义
工程定义里需要用到的属性。
如
- <requiredProperties>
- <requiredProperty key="appName">
- <defaultValue>helloworld</defaultValue>
- </requiredProperty>
- <requiredProperty key="groupId">
- <defaultValue>com.alibaba.china.app</defaultValue>
- </requiredProperty>
- <requiredProperty key="artifactId">
- <defaultValue>helloworld</defaultValue>
- </requiredProperty>
- <requiredProperty key="package">
- <defaultValue>com.alibaba.china.app</defaultValue>
- </requiredProperty>
- </requiredProperties>
这些属性可以在资源元文件里的任意一个文件里通过${var}来引用,所以的元文件最终都可以选择通过velocity引擎来执行替换后生成。
默认的属性有:groupId,artifactId,packeage,version等。如在元文件里定义pom文件可以用:
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<packaging>pom</packaging>
<version>${version}</version>
2.项目子模块定义
可选,在定义多工程时才需要。如:
- < modules>
- < module id= "service.common" dir = "common" name= "service.common" >
- .......
- < /module>
- < module id= "service.core" dir = "core" name= "service.core" >
- .......
- < /module>
- </modules>
module有三个属性,解释如下:
id :相当于工程的artifactId.
dir :相当于工程源文件在archetype-resources里对应的directory.
name :模块的名字.
3.项目文件集定义
fileSets/fileSet* 文件集合定义
如
- <fileSet filtered="true" encoding="UTF-8" packaged="true">
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.java</include>
- <include>**/*.txt</include>
- </includes>
- </fileSet>
以上代表将archetype-resources里的src/main/java目录及内容作为新工程的目录和内容。里面的每个文件生成都会使用velocity模板引擎渲染,以替换变量。同时当packaged=true是表示会在生成这些新文件的时候,前面加上默认的包。
些属性做到可配置的变量。
总结
通过以上两部分定义之后,执行命令mvn clean install就将archetype安装到本地仓库了。
再通过如下命令:
- mvn archetype:generate -DarchetypeCatalog=local
选择你定义的工程archetype,同时通过交互输入需要的属性变量,就会默认生成好你定义的工程。
一下工程结构是我上面根据例子里定义的archetype生成的多子模块工程:
archtype定义工程源码见附件。
这篇关于【maven】多子模块maven模板工程archetype创建过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!