Maven自定义脚手架(多module模块)+自定义参数

脚手架

视频教程:
Maven保姆级教程

脚手架是一个项目模板,包含常用的工程结构、代码。

1 自定义脚手架

脚手架创建的步骤如下,先创建一个工程,把常用的代码写好,进入工程根目录,进行如下操作:

打包模板

mvn archetype:create-from-project

进入模板目录,修改文件配置

cd ./target/generated-sources/archetype

如果想让文件中的替换变量生效,需要先修改META-INF.maven/archetype-metadata.xml

将对应目录或文件增加 filtered="true"

再使用变量替换对应文件内容

部署本地

mvn install

上传仓库

mvn deploy
下面用一个多模块的项目做演示,包含xml文件,yml文件,和其他文件。

我们要创建一个脚手架,使用这个脚手架创建工程时,xxx要替换成指定值。

在根目录下创建archetype.properties文件

properties 复制代码
archetype.groupId=com.test.maven
archetype.artifactId=archetype-test
archetype.version=1.0-SNAPSHOT
excludePatterns=**/.idea/**,**/*.iml

archetype-test(父工程)的pom中加入:

xml 复制代码
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-archetype-plugin</artifactId>
      <version>3.2.0</version>
    </plugin>
  </plugins>
</build>

进入项目根目录,执行mvn archetype:create-from-project

执行成功后,跟目录下会有一个target文件夹生成

接着要替换占位符,比如每个项目名字不一样,xxx要替换成项目名,每个项目package前缀不一样,也要替换;

常用占位符如下:

Variable Meaning
rootArtifactId 做文件夹名替换用,例如_rootArtifactId_-dao, 占位符来动态获取父工程的ArtifactId
${rootArtifactId} 它保存用户输入的值作为项目名(maven在用户运行原型时在提示符中询问为artifactid:的值)
${artifactId} 如果您的项目由一个模块组成,则此变量的值将与${rootArtifactId}相同,但如果项目包含多个模块,则此变量将由每个模块文件夹中的模块名替换
`${package} 用户为项目提供的包,也在用户运行原型时由maven提示
${packageInPathFormat} 与${package}变量的值相同,但将"."替换为字符"/",例如:,对于包com.foo.bar,此变量为com/foo/bar
${groupId} 用户为项目提供的groupid,在用户运行原型时由maven提示
${version} 版本号

首先替换module的名字,把xxx替换成_rootArtifactId_,注意两边是两个下划线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kg2ParTl-1692174116914)(/image-20230815094204095.png)]

接着依次点开每一个编译后的文件,查看一下有没有没替换的占位符,正常编译好的,动态部分都会替换掉,如下图:

但是也会有一些替换错的,有时候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时默认名

xml 复制代码
 <!--属性变量定义-->
  <requiredProperties>
    <requiredProperty key="appName">
      <defaultValue>demo</defaultValue>
    </requiredProperty>
    <requiredProperty key="appNameCap">
      <defaultValue>Demo</defaultValue>
    </requiredProperty>
  </requiredProperties>

去替换文件中的内容,路径中的参数是双下划线_参数名_,文件内部的参数是${参数名}

一般xml文件、java文件模板会自动替换占位符,另外有一些自定义文件,模板不会识别,比如sh脚本、md文件等,我们以Dockerfile为例(随便自己定义个文件也行),在archetype-metadata.xml写<fileSets>

xml 复制代码
    <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下面如果有默认不识别的文件也要单独配置:

去替换文件中的内容:

注意检查文件,没有遗漏之后可以安装脚手架了,上面示例只是替换了一些常用文件,并没有替换所有,根据自己需求,替换所有需要编辑的文件。

进入target\generated-sources\archetype下,执行 mvn install

注:如果有自定义参数,需要在test/resources/projects/archetype.properties里配置自定义参数

执行成功后,在我们本地的maven仓库里会有一个archetype-catalog.xml文件
打开这个文件就能看到已经安装的脚手架信息:

2 使用脚手架

2.1 命令

在工作区里执行:mvn archetype:generate -DappName=abc -DappNameCap=Abc

其中-D后面接的时自定义参数,也可以接默认参数,如-DgroupId
如果你安装过多个脚手架,会提示一个脚手架列表,选择脚手架编号:

会提示我们让我们输入各项参数,

确认按Y或者回车;

输入其他字母,重新输入参数;

按ctrl+c终止创建工程

2.2 idea

或者直接用idea

旧版

2.3 Eclipse

项目就创建好了

删除脚手架只要删除archetype-catalog.xml对应的节点就可以了

相关推荐
Dola_Pan19 分钟前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book22 分钟前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
蜗牛^^O^1 小时前
Docker和K8S
java·docker·kubernetes
从心归零2 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe4 小时前
分布式系统实战经验
java·分布式
是梦终空4 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss4 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸4 小时前
flink doris批量sink
java·前端·flink