1、示例项目
2、在pom.xml中添加archetype插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.0</version>
</plugin>
3、打包排除某些目录
当我们使用maven-archetype-plugin 插件基于当前项目生成一个 archetype 模板项目时,默认的该插件会把当前项目下所有的文件都会打包到 jar包中。很多时候我们希望在 build 的时候能过滤一些非必要的文件目录,如 .idea、项目 README.md 说明文件等等,这时候我们需要在构建的时候,配置一个 archetype.properties
文件参数,并在其中定义 excludePattern
属性来过滤文件或目录。
在项目目录下创建archetype.properties
,内容如下:
# 打包过滤文件
excludePatterns=.idea/*,.git,*.iml,.idea/
excludePatterns
可以指定多个过滤条件,以英文逗号分割即可,不过需要注意的是,如果想过滤整个目录,如 .idea
目录,需要配置为: .idea/*
而不能仅填写为 idea。
4、包含.gitignore
# 注意__是2个下划线
把.gitignore重命名为__gitignore__
在上面的archetype.properties
中加入gitignore=.gitignore
5、进入示例项目,执行以下命令
mvn archetype:create-from-project --settings D:\DevelopTools\apache-maven-3.6.3\conf\settings.xml -Darchetype.properties=archetype.properties
运行完后会在target目录生成模板
因为我这项目的主目录与子目录前缀不一样,所以生成的模板要手工替换,如果一样的话会自动替换为__rootArtifactId__
自动替换的示例:
既然不能自动替换那就手工更改
6、替换占位符
接着要替换占位符,比如每个项目名字不一样,上述moyu要替换成项目名,每个项目package前缀不一样,也要替换;
常用占位符如下:
占位符 | 含义 |
---|---|
__rootArtifactId__ | 做文件夹名替换用,注意__ 是双下划线,例如__rootArtifactId__-dao , 占位符来动态获取父工程的ArtifactId |
${rootArtifactId} | 保存用户输入的值作为项目名(maven在用户运行原型时在提示符中询问为artifactid:的值) |
${artifactId} | 如果您的项目由一个模块组成,则此变量的值将与${rootArtifactId} 相同,但如果项目包含多个模块,则此变量将由每个模块文件夹中的模块名替换 |
${package} | 用户为项目提供的包,也在用户运行原型时由maven提示 |
${packageInPathFormat} | 与${package} 变量的值相同,但将“.”替换为字符“/”,例如对于包com.foo.bar,此变量为com/foo/bar |
${groupId} | 用户为项目提供的groupid,在用户运行原型时由maven提示 |
${version} | 用户为项目提供的版本号,在用户运行原型时由maven提示 |
首先替换module的名字,把moyu替换成__rootArtifactId__
,注意两边是两个下划线
接着依次点开每一个编译后的文件,查看一下有没有没替换的占位符,正常编译好的,动态部分都会替换掉,如下图:
再查找项目中其它与示例项目moyu有关的项,改为对应的占位符,如下这些依赖
替换后的效果
找到项目中的每一个文件都要全替换成占位符
但是也会有一些替换错的,有时候package前缀和groupId一样时,一些package会被替换成groupId,我们要手动修正它;
当前项目里,这个application.yml
就没有被替换掉
替换成以下内容:
接着是核心文件:archetype-metadata.xml
找到modules节点,每个modules都要替换,module属性介绍:
id:子模块工程的artifactId
dir:子模块工程源文件在archetype-resources里对应的directory
name :子模块的名字.,可定制化自己的服务模块。
替换如下:
如果有其他自定义参数,比如项目中的xxx和类名中的Xxx需要替换,可以自定义参数,自定义参数在archetype-metadata.xml
里加入<requiredProperties>
key是属性名,defaultValue时默认名
<!--属性变量定义-->
<requiredProperties>
<requiredProperty key="appName">
<defaultValue>szcz</defaultValue>
</requiredProperty>
<requiredProperty key="appNameCap">
<defaultValue>Szcz</defaultValue>
</requiredProperty>
</requiredProperties>
去替换文件中的内容,路径中的参数是双下划线_参数名_
,文件内部的参数是${参数名}
这种改了文件名的,需要在target\test-classes\projects\basic\project\basic找到原目录删除原文件,不然生成的archetype会同时生成旧的文件。
一般xml文件、java文件模板会自动替换占位符,另外有一些自定义文件,模板不会识别,比如sh脚本、md文件等,我们以Dockerfile为例(随便自己定义个文件也行),在archetype-metadata.xml写<fileSets>
<fileSets>
<!-- 写进模板,但不替换的占位符的,不设置 filtered="true"即可-->
<!-- 写进模板,要替换的占位符的,filtered="true"-->
<fileSet encoding="UTF-8" filtered="true">
<directory></directory>
<includes>
<include>Dockerfile</include>
<include>README.md</include>
</includes>
</fileSet>
</fileSets>
每一个module下面如果有默认不识别的文件也要单独配置:
去替换文件中的内容:
注:如果有自定义参数,需要在test/resources/projects/archetype.properties
里配置自定义参数
spring.factories内容替换
在archetype-metadata.xml写<fileSets>
上正面内容
<module id="${rootArtifactId}-starter-cloud" dir="__rootArtifactId__-starter-cloud" name="${rootArtifactId}-starter-cloud">
<fileSets>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.factories</include>
</includes>
</fileSet>
</fileSets>
</module>
效果图
7、安装Archetype
全部修改完后,进入target\generated-sources\archetype下,执行mvn install
安装到本地
执行成功后,在我们本地的maven仓库里会有一个archetype-catalog.xml文件。
8、使用Archetype
在一个新的目录下执行以下命令,会把新项目生成到对应的目录下
# 其中-D后面接的时自定义参数,也可以接默认参数,如-DgroupId
mvn archetype:generate -DarchetypeCatalog=local -DappName=szcz -DappNameCap=Szcz
按提示输入对应的内容即可