`
singleant
  • 浏览: 378631 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【maven】多子模块maven模板工程archetype创建过程

 
阅读更多

最近项目里需要创建一个多模块(子工程)的模板项目,所以研究了一下maven的archetype plugin。

创建了一个包含多个子模块工程的项目模板。记录下过程。

 

 

一个模板工程任务就是创建一个或多个默认的工程,并为每个工程填充好默认的一些文件和配置。同时要抽象出生成的工程需要的一些属性,做到这些属性可动态配置。

在maven里通过定制的archetype来生成项目模板。maven本身内置了很多archetype 工程模板。通过
mvn archetype:generate
 命令,mvn会列举出支持的所有项目模板。可以根据需求选择一个模板生成项目工程。
如果这些默认的模板还不够用,或者公司内部还希望定制自己个性化的工程模板,可以自己制作工程模板。
下面讲下archetype的制作过程。工程模板可以通过一个maven的archetype工程来定义。
下面的例子我编写的servicearchetype maven工程,是用来定义一个多模块的工程。

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定义工程源码见附件。

  • 大小: 39.6 KB
  • 大小: 30.2 KB
分享到:
评论
7 楼 wenwen0823 2016-05-19  
项目继承不下来。。
6 楼 sum_guo 2015-12-02  
坑比   
5 楼 kolenxiao 2015-04-22  
没必要全部都是手动去编写,先用mvn archetype:create-from-project创见一个原始的版本,再手动修改一点点就行了
4 楼 wshdzkd 2014-12-22  
mark一下,值得学习
3 楼 ch_space 2012-12-17  
singleant 写道

要先通过执行命令mvn clean install 将例子里定义的archetype安装到本地仓库  之后在执行mvn archetype:generate -DarchetypeCatalog=local 


是先执行了mvn clean install,看了下本地mvn仓库也有的,还是出不来选项,跟maven版本、velocity有关吗?我的maven版本是2.2.1
2 楼 singleant 2012-12-17  
ch_space 写道
请教一下,用你的附件试了下,生成新项目时候没有出现可选择的archetype选项,请问下什么原因?
D:\Backup\project>mvn archetype:generate -DarchetypeCatalog=local
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.
0)
Choose archetype:
   Your filter doesn't match any archetype (hint: enter to return to initial list)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :

要先通过执行命令mvn clean install 将例子里定义的archetype安装到本地仓库  之后在执行mvn archetype:generate -DarchetypeCatalog=local 
1 楼 ch_space 2012-12-17  
请教一下,用你的附件试了下,生成新项目时候没有出现可选择的archetype选项,请问下什么原因?
D:\Backup\project>mvn archetype:generate -DarchetypeCatalog=local
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.
0)
Choose archetype:
   Your filter doesn't match any archetype (hint: enter to return to initial list)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): :

相关推荐

    使用Maven构建多模块项目

    使用Maven Archetype插件可以快速创建一个多模块项目模板。首先,创建一个父项目,然后在父项目的pom.xml中添加子模块的定义,最后在父项目目录下为每个子模块生成对应的目录结构和基本的pom.xml。 4. 依赖管理: ...

    maven多模块项目构建过程

    本篇文章将详细探讨"Maven多模块项目构建过程",并结合提供的资源"搭建maven多工程模块步骤",来深入理解如何创建和管理一个包含多个子项目的Maven工程。 1. Maven多模块项目概述: Maven多模块项目是指由一个父...

    maven多模块项目工程-已搭建好

    在Eclipse中,你可以通过“New -&gt; Maven Project”创建新的Maven项目,并选择“Create a simple project”或“Create a multi-module project”来构建多模块工程。 3. **依赖管理**:在"xd-parent"的`pom.xml`中,...

    【Maven】〖项目模板文件〗archetype-catalog.xml

    【Maven】〖项目模板文件〗archetype-catalog.xml 我寻见一片海 碧蓝且耀着光 大片船只航行其上 都向着远方 Shared by Foriver_江河 © 1997-8023 江河 All Rights Reserved.

    maven_archetype

    Maven Archetype 并非一个简单的模板,而是一种可重复使用的构建模块,能够根据预定义的配置生成一个新的 Maven 项目。这种机制极大地简化了新项目的初始化过程,尤其是对于遵循特定规范或框架的项目。 ### Maven ...

    Maven 项目模板archetype-catalog.xml

    Maven Archetype是Maven提供的一个功能,用于创建可重复使用的项目模板。每个Archetype都包含一组文件和目录结构,当用户使用该模板时,Maven会根据模板生成一个新的项目,填充默认的POM配置和必要的初始化文件。 ...

    maven分模块小demo

    在软件开发过程中,Maven作为一个强大的项目管理和构建工具,被广泛应用。它通过使用XML格式的配置文件(pom.xml)来管理项目的依赖、构建过程以及发布等任务。本"maven分模块小demo"旨在展示如何利用Maven的多模块...

    maven分模块的web工程

    ** Maven分模块Web工程详解 ** 在现代软件开发中,大型项目往往需要模块化管理,以便于代码组织、分工协作和提高复用性。Maven作为Java开发中的主流构建工具,提供了强大的模块化支持,使得我们可以将一个复杂的Web...

    maven多模块项目(简单实例)

    在实际开发中,Maven多模块项目还有助于团队协作,每个开发者可以专注于自己负责的模块,而无需关心整个项目的构建过程。同时,当项目变得庞大时,多模块设计也有利于进行单元测试和独立部署。 总结来说,Maven多...

    SpringBoot + proguard+maven多模块实现代码混淆

    基于SpringBoot+Maven多模块工程利用proguard组件实现代码混淆的代码demo,代码清晰完整,导入idea或eclipse即可运行。 使用 proguard 混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。常用的应用...

    eclipse 创建maven项目 选择 archetypes所用到的jar包

    如果你发现现有的Archetypes不能满足需求,或者想要创建自己的项目模板,可以通过编写Archetype配置文件(archetype-descriptor.xml)和模板代码来实现。自定义的Archetypes可以发布到私有或公共的Maven仓库,供团队...

    maven多模块项目

    要创建一个Maven多模块项目,首先我们需要在`pom.xml`文件中定义项目的整体结构,包括各个模块的依赖关系。例如,一个典型的电商项目可能包含以下几个模块:`parent`(父模块),`common`(公共模块,包含共享的代码...

    maven-archetype-quickstart-1.1.jar包下载

    `maven-archetype-quickstart-1.1.jar` 是一个Maven的快速启动 archetype 包,专门用于帮助开发者快速创建一个新的Maven项目结构。在这个压缩包中,你将找到一个预设的Java项目模板,以便于你能够迅速地开始编码。 ...

    如何提高Maven多模块项目编译速度.docx

    在开发大型Java项目时,Maven多模块结构的使用非常常见,它可以帮助我们更好地管理和组织代码。然而,当项目变得庞大时,编译速度可能会成为一个显著的问题。以下是一些优化Maven多模块项目编译速度的策略: 1. **...

    maven_archetype-catalog.zip

    为了解决这些问题,我们可以利用"Maven Archetype Catalog",这是一个包含了多种Maven模板的元数据文件,能够帮助我们快速、稳定地创建新项目。 标题中的"maven_archetype-catalog.zip"就是一个Maven Archetype ...

    maven项目搭建:archetype-catalog.xml

    2021-10-28官网下载archetype-catalog.xml。(maven项目快速搭建,缺少这个文件时,提示maven-archetype-webapp could not resolve archetpye)

    maven-archetype-webapp-1.0.jar下载

    总的来说,Maven Archetype Webapp 1.0.jar是Java Web开发者的重要工具,它简化了项目初始化过程,使得开发者可以更加专注于业务逻辑的实现,而非重复的项目搭建工作。通过理解和有效利用这一工具,开发者可以更高效...

    maven 逆向逆向工程

    1. **Maven Archetype插件**:Maven Archetype插件是实现逆向工程的核心工具,它可以创建基于模板的新项目。在逆向工程中,Archetype插件会分析已存在的类和资源,生成相应的pom.xml文件以及项目目录结构。 2. **...

Global site tag (gtag.js) - Google Analytics