概述
目录
- 开头说
- 1. Maven模板
- 1.1 生成指令
- 1.2 模板目录
- 1.3 从日志浅析模板的作用
- 2. 常见的模板
- 2.1 Maven插件模板
- 2.2 Java EE Web 模板
- 3. 自定义模板
- 3.1 初试create-from-project
- 3.2 archetype-metadata文件
- 3.3 生成模板时自定义参数
- 总结
开头说
本讲来介绍Maven原型(archetype),这个词源于古希腊语,意指原始的类别。Maven工程也有许多类别,比如普通Java工程、Web工程,甚至是用于构建maven插件的工程。每种类别都有相同的基础目录结构,那么就可以以一个初始模板作为构建每种类型项目的起步。Maven原型就是使用了模板模式,也成为Maven模板。
本讲包括Maven模板、常用的模板、自定义模板。
1. Maven模板
maven模板本身是一个插件,它既可以从模板创建项目,也可以从项目构建模板,包含以下goal:
- generate: 根据给定的模板生成特定类型的项目。
- create-from-project: 把某一项目作为模板。
- crawl: 爬取本地的目录结构来生成模板,并存储原型目录。
- help:
以下三个在生成模板时使用: - jar:
- integration-test:
- update-local-catalog: 更新本地的原型目录,在自定义模板的时候使用。
1.1 生成指令
最简单的一个生成对应项目命令:
$ mvn archetype:generate -DgroupId=com.packt.samples
-DartifactId=com.packt.samples.archetype
-Dversion=1.0.0
-DinteractiveMode=false
interactiveMode=false表示不使用交互模式。这个和以下命令是等效的(注意 -B 参数):
$ mvn archetype:generate -B
-DgroupId=com.packt.samples
-DartifactId=com.packt.samples.archetype
-Dversion=1.0.0
如果是交互模式,命令行会提示输入相关的参数,并从给定的参考中选择。例如:
接着你可以输入对应的数字,或者使用过滤条件,如果直接回车,默认是7,就是选择 maven-archetype-quickstart
1.2 模板目录
仔细观察上面的Choose archetype,可以看到10个供选择的模板都是internal的。其实这些是从内置的一个目录xml文件获取的。此外还有本地和远程的目录xml。这个xml的结构如图所示:
<archetype-catalog>
<archetypes>
<archetype>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<repository></repository>
<description></description>
</archetype>
...
</archetypes>
</archetype-catalog>
其中repository是公有的仓库地址。
为方便筛选特定的模板,可以使用archetypeCatalog参数。
mvn archetype:generate -DarchetypeCatalog=internal
mvn archetype:generate -DarchetypeCatalog=local
mvn archetype:generate -DarchetypeCatalog=remote
使用crawl可以从本地的模板集合生成模板目录文件:
mvn archetype:crawl -DcatalogFile=my-catalog.xml
1.3 从日志浅析模板的作用
在generate的命令最后加上 -X 开启debug日志。
[DEBUG] Searching for remote catalog: http://maven.aliyun.com/nexus/content/groups/public//archetype-catalog.xml
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
[DEBUG] Using catalog R:CodingRepositoryMavenRepositoryarchetype-catalog.xml
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
[DEBUG] Not found archetype org.apache.maven.archetypes:maven-archetype-quickstart:1.0 in cache
[DEBUG] Found archetype org.apache.maven.archetypes:maven-archetype-quickstart:1.0 in cache: R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] checking fileset archetype status on R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] Searching for META-INF/maven/archetype-metadata.xml inside R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] - META-INF/
[DEBUG] - META-INF/MANIFEST.MF
[DEBUG] - archetype-resources/
[DEBUG] - archetype-resources/src/
[DEBUG] - archetype-resources/src/main/
[DEBUG] - archetype-resources/src/main/java/
[DEBUG] - archetype-resources/src/test/
[DEBUG] - archetype-resources/src/test/java/
[DEBUG] - archetype-resources/pom.xml
[DEBUG] - archetype-resources/src/main/java/App.java
[DEBUG] - archetype-resources/src/test/java/AppTest.java
[DEBUG] - META-INF/archetype.xml
[DEBUG] - META-INF/maven/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/pom.xml
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/pom.properties
[DEBUG] Found archetype org.apache.maven.archetypes:maven-archetype-quickstart:1.0 in cache: R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] checking old archetype status on R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] Searching for META-INF/maven/archetype.xml inside R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] - META-INF/
[DEBUG] - META-INF/MANIFEST.MF
[DEBUG] - archetype-resources/
[DEBUG] - archetype-resources/src/
[DEBUG] - archetype-resources/src/main/
[DEBUG] - archetype-resources/src/main/java/
[DEBUG] - archetype-resources/src/test/
[DEBUG] - archetype-resources/src/test/java/
[DEBUG] - archetype-resources/pom.xml
[DEBUG] - archetype-resources/src/main/java/App.java
[DEBUG] - archetype-resources/src/test/java/AppTest.java
[DEBUG] - META-INF/archetype.xml
[DEBUG] - META-INF/maven/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/pom.xml
[DEBUG] - META-INF/maven/org.apache.maven.archetypes/maven-archetype-quickstart/pom.properties
[DEBUG] Searching for META-INF/archetype.xml inside R:CodingRepositoryMavenRepositoryorgapachemavenarchetypesmaven-archetype-quickstart1.0maven-archetype-quickstart-1.0.jar
[DEBUG] - META-INF/
[DEBUG] - META-INF/MANIFEST.MF
[DEBUG] - archetype-resources/
[DEBUG] - archetype-resources/src/
[DEBUG] - archetype-resources/src/main/
[DEBUG] - archetype-resources/src/main/java/
[DEBUG] - archetype-resources/src/test/
[DEBUG] - archetype-resources/src/test/java/
[DEBUG] - archetype-resources/pom.xml
[DEBUG] - archetype-resources/src/main/java/App.java
[DEBUG] - archetype-resources/src/test/java/AppTest.java
[DEBUG] - META-INF/archetype.xml
[DEBUG] Entry found
从以上日志可以看出,先在远程的仓库(我配置的是ali的仓库)找模板信息,找不到就在本地仓库路径下的archetype-catalog.xml文件中找。以上找不到就默认maven-archetype-quickstart。
接着在jar中搜寻以下文件。
- META-INF/maven/archetype-metadata.xml
- META-INF/maven/archetype.xml
- META-INF/archetype.xml
最终找到对应的文件,就可以以此生成基础的文件结构了。
<archetype>
<id>quickstart</id>
<sources>
<source>src/main/java/App.java</source>
</sources>
<testSources>
<source>src/test/java/AppTest.java</source>
</testSources>
</archetype>
2. 常见的模板
2.1 Maven插件模板
在之前的第三讲中,我们自定义插件的时候需要自定创建目录,但是如果使用模板,这些就容易了。
mvn archetype:generate
-DgroupId=com.packt.samples
-DartifactId=com.packt.samples.plugins.myplugin
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-plugin
-DinteractiveMode=false
这样,一个基本的目录:
2.2 Java EE Web 模板
maven-archetype-webapp
mvn archetype:generate -B
-DgroupId=com.packt.samples
-DartifactId=my-webapp
-Dpackage=com.packt.samples.webapp
-Dversion=1.0.0
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-webapp
-DarchetypeVersion=1.0
生成的目录如下:
或使用webapp-javaee6
mvn archetype:generate -B
-DgroupId=com.packt.samples
-DartifactId=my-webapp
-Dpackage=com.packt.samples.webapp
-Dversion=1.0.0
-DarchetypeGroupId=org.codehaus.mojo.archetypes
-DarchetypeArtifactId=webapp-javaee6
-DarchetypeVersion=1.3
生成的目录如下:
本想介绍一下使用模板构建Spring Boot项目,但是现在一般使用官方的https://start.spring.io/。
3. 自定义模板
3.1 初试create-from-project
虽然已有的Maven有很多,但是仍不排除我们需要自定义的模板。对于某些特殊的项目结构,我们可以把基础的结构抽取成项目模板。从已有项目生成模板的命令是:
mvn archetype:create-from-project
在使用create-from-project时,必须是从Maven的项目。以下是我的项目下的pom文件(注意引入了maven-archetype-plugin):
<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.sunq.arche</groupId>
<artifactId>arche-test</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>test archetype</name>
<description>test-archetype</description>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
另外,需要项目的目录下有 /archetype-resources/pom.xml 文件,这个pom定义Archetype的坐标信息,如下:
<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.sunq.arche</groupId>
<artifactId>arche-test</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 这里必须配置,不然生成的项目的配置文件会有编码问题 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>${artifactId}</finalName>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
执行开始给出的create-from-project,生成的maven模板插件jar包的名字是上面模板坐标的ArtifactId后缀加上 -archetpe。
这个pom文件是必须要有的,如果没有这个文件,报以下错误-系统找不到指定的路径:
另外还有一些文件是可选的:
- META-INF/maven/archetype-metadata.xml : 模板的描述文件,在用模板生成项目时,会提示该模板的用途。
- archetype-resources/xxx : 其它要包含在模板里面的内容。
本小节的源码文件在这里。
3.2 archetype-metadata文件
模板元数据信息(包含模板的名称、模板生成项目所使用的文件)存储在 META-INF/maven/archetype-metadata.xml 。此文件的龙骨如下:
<archetype-descriptor xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
name=.. partial=.. >
<requiredProperties>
<requiredProperty key=.. >
<defaultValue/>
<validationRegex/>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet filtered=.. packaged=.. encoding=.. >
<directory/>
<includes/>
<excludes/>
</fileSet>
</fileSets>
<modules>
<module id=.. dir=.. name=.. >
<fileSets>
<fileSet filtered=.. packaged=.. encoding=.. >
<directory/>
<includes/>
<excludes/>
</fileSet>
</fileSets>
<modules>
<module>...recursion...<module>
</modules>
</module>
</modules>
</archetype-descriptor>
接下来,我们对描述文件的主要标签的含义解释一下:
- archetype-descriptor: 这个标签是最外层的标签, name 属性是archetype的名字,也就是显示的选项名称,partial 表时当前的模板是否代表整个项目,默认是false。
- requiredPropertie: 从这个模板生成项目所需要的属性。
- fileSet: 定义依据模板生成项目时,模板jar包中的文件是如何变为项目的代码文件的。其中的filtered属性表示选中文件是否作为velocity模板。关于velocity模板请参考这里。
- module 这个会在生成多模块Maven项目时候使用。
各标签内部具体的细节请参考官方说明。
3.3 生成模板时自定义参数
在从项目生成模板时,如果项目的自身的pom文件会有一些参数,这些参数是通过占位符的形式出现的。我们可以定义默认的传入值。
$ mvn archetype:create-from-project -Darchetype.properties=archetype.properties
上面的命令是生成模板时,指定默认值是对应的配置文件中的值。
当然,我们在从模板生成项目时,这些参数是可以专门指定,来覆盖默认值的。
总结
这次我们介绍了Maven的Archetype,也就是模板。以模板生成项目带来很多方便,我们也可以基于已有项目生成自己需要的模板。
最后
以上就是虚拟老鼠为你收集整理的快速全面入门Maven(四)--原型1. Maven模板2. 常见的模板3. 自定义模板总结的全部内容,希望文章能够帮你解决快速全面入门Maven(四)--原型1. Maven模板2. 常见的模板3. 自定义模板总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复