快速全面入门Maven(四)--原型

开头说

  本讲来介绍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: 更新本地的原型目录,在自定义模板的时候使用。
    几个goal的关系图

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:\CodingRepository\MavenRepository\archetype-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:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-archetype-quickstart-1.0.jar
[DEBUG] checking fileset archetype status on R:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-archetype-quickstart-1.0.jar
[DEBUG] Searching for META-INF/maven/archetype-metadata.xml inside R:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-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:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-archetype-quickstart-1.0.jar
[DEBUG] checking old archetype status on R:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-archetype-quickstart-1.0.jar
[DEBUG] Searching for META-INF/maven/archetype.xml inside R:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-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:\CodingRepository\MavenRepository\org\apache\maven\archetypes\maven-archetype-quickstart\1.0\maven-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文件是必须要有的,如果没有这个文件,报以下错误-系统找不到指定的路径:
缺少maven的archetype的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,也就是模板。以模板生成项目带来很多方便,我们也可以基于已有项目生成自己需要的模板。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值