一、Archetype简介
Archetype是Maven的项目模板工具包,开发者可以根据archetype模板导出一个maven骨架项目,然后在此项目上进行开发。使用过maven的开发者都知道,eclipse新增maven项目的时候都会弹出一个项目设置向导,这个向导背后的技术支持就是archetype。
二、开发自己的Archetype
虽然maven内部提供了不少archetype模板,但是很多模板都是一些基础性的例子,用来学习还行,如果要用在实际开发项目中就显得比较鸡肋。另外每家公司都有自己的开发习惯、代码风格、代码结构、业务代码等,很多模板无法直接套用,因此开发一套自己的archetype模板才有实际意义。
三、Archetype模板项目基本结构
archetype
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `--archetype-metadata.xml
`-- archetype-resources
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- App.java
`-- test
`--java
`-- AppTest.java
Archetype模板项目跟普通项目一样也是一个maven项目,但是它的目录结构要稍复杂些。一般一个archetype模板项目必须要包含以下文件:
- pom.xml
- archetype-metadata.xml
- archetype-resources/
archetype模板项目的pom.xml跟普通maven项目一样,也需要设置groupId、artifactId、version、packaging等元素。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.groupId</groupId>
<artifactId>my-archetype-id</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-archetype</packaging>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>3.1.1</version>
</extension>
</extensions>
</build>
</project>
需要注意的是archetype模板项目的打包类型并没有规定必须是maven-archetype
,你定义成jar
也是没关系的。至于为什么要定义成maven-archetype
,可以参看maven官方的Maven Archetype Packaging教程
四、Archetype描述文件
Archetype描述文件也就是上面提到过的archetype-metadata.xml
,下面我们来看一下该文化所包含的内容:
<archetype-descriptor
xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0
https://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="quickstart">
<fileSets>
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
</fileSet>
<fileSet>
<directory>src/test/java</directory>
</fileSet>
</fileSets>
</archetype-descriptor>
该文件主要包含了fileSets
这个元素,一个fileSets
又可包含一个或者多个fileSet
子元素,每一个fileSet
元素下定义了一个directory
目录元素,它最终会指向archetype-resources/
目录下的子目录。fileSet
有两个属性filtered
和packaged
。
-
filtered
表示是否对directory
指定的目录中的文件应用属性替换,比如src/main/java
目录下的App.java
这个文件,其中使用了String name = "${X}";
这样一段代码,然后开发者通过命令或者eclipse从该archetype模板项目导出骨架项目的时候会输入X的具体替换内容,最终导出后name的值就是你所替换的内容。 -
packaged
表示是否将该目录下的内容放到生成项目的包路径下。比如开发者从该archetype模板项目导出骨架项目的时候,设置package=com.start.archetype,如果package=true
,那么最终生成的项目目录为src/main/java/com/start/archetype/App.java
,反之目录为src/main/java/App.java
。一般对于java文件设置为package=true
,对于properties等配置文件设置为package=false
。
archetype-metadata.xml
文件中各个元素的详细解释请参考Archetype-Descriptor教程。
五、模板文件
既然是Archetype模板项目,那么模板在哪里呢?答案是archetype-resources/
目录,该目录下包含了一个完整maven项目,当然它跟普通的maven项目还是有些区别的。
- 从Archetype模板项目基本结构中我们可以看出,
archetype-resources/src/main/java/App.java
是没有基础包名的。比如你有一个正常的mave项目,其java目录结构如下:
simple-project
|-- pom.xml
`-- src
|-- main
`-- java
`-- com
`-- simple
|-- App.java
`-- service
| `--TestService.java
`-- dao
`--TestDao.java
假设基础包名为com.simple
,那么archetype-resources目录下的java目录结构应改为:
simple-project
|-- pom.xml
`-- src
|-- main
`-- java
|-- App.java
`-- service
| `--TestService.java
`-- dao
`--TestDao.java
- 除了目录结构外,java文件中的包名也需要通过Maven Archetype变量进行替换,具体如下:
package ${package};
public class App {
....
....
}
package ${package}.service;
public class TestService {
....
....
}
package ${package}.dao;
public class TestDao {
....
....
}
从上面的代码中我们可以看出,基础包名com.simple都被${package}
这个Maven Archetype变量替换了,它的作用就是当开发者从该archetype导出一个新的骨架项目的时候,假如package=com.simple.new,那么导出的java文件中${package}
会替换为com.simple.new。
六、导出骨架项目
1、使用mvn install安装Archetype模板项目本身
2、使用mvn archetype:generate导出骨架项目
mvn archetype:generate \
-DarchetypeGroupId=<archetype-groupId> \
-DarchetypeArtifactId=<archetype-artifactId> \
-DarchetypeVersion=<archetype-version> \
-DgroupId=<my.groupid> \
-DartifactId=<my-artifactId>
3、如果你对于手动编写以上文件有点反感,那么你可以使用maven官方提供的用来生成Archetype模板项目的Archetype:
mvn archetype:generate
-DgroupId=[your project's group id]
-DartifactId=[your project's artifact id]
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-archetype
七、参考源码
https://gitee.com/jack_junjie/demo-start-archetype,这个源码是我自己编写的案例,文件名称略有不同,但是思路是一样的。
网友评论