把项目打包成Maven Archetype(多模块项目脚手架)

1、示例项目

2、在pom.xml中添加archetype插件

xml 复制代码
<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时默认名

xml 复制代码
 <!--属性变量定义-->
 <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>

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

去替换文件中的内容:

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

spring.factories内容替换

在archetype-metadata.xml写<fileSets>上正面内容

xml 复制代码
<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

按提示输入对应的内容即可

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

相关推荐
潜洋9 分钟前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
暮志未晚Webgl28 分钟前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
小叶lr1 小时前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_429856571 小时前
idea启动服务报错Application run failed
java·ide·intellij-idea
瑞雨溪1 小时前
java中的this关键字
java·开发语言
J不A秃V头A1 小时前
Redisson 中开启看门狗(watchdog)机制
java·分布式锁·看门狗
草字1 小时前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app
李迟1 小时前
某Linux发行版本无法使用nodejs程序重命名文件问题的研究
java·linux·服务器
MapleLea1f1 小时前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
没有黑科技1 小时前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot