Maven如何自定义脚手架

引言

在项目越来越多的背景下要保证开发效率保证系统稳定,项目标准化将不可避免,其中最开始的就是要有一个或多个骨架工程。 使用这些骨架工程开发实现统一的设计理念,技术栈,功能组件,架构风格,开发规范等一致的约束。

Maven的脚手架是什么

在idea的创建项目中这些选择就是离我们最近的maven脚手架。

image-20210505235333756

脚手架的工程目录结构与常见maven开发工程差异体具体如下(红色代表定死的,蓝色代表可更改的)

image-20210506000830785

最外层的archetype文件夹下的pom.xml文件

  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.archetype</groupId>
        <artifactId>archetype-packaging</artifactId>
        <version>2.2</version>
      </extension>
    </extensions>

    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-archetype-plugin</artifactId>
          <version>2.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

通过上面图二生成的工程目录

image-20210506234457759

如何自定义一个脚手架工程

工程创建

  1. 除了根据前面目录结构手动组装一个脚手架的maven
  2. 我更推荐先准备一个标准的maven工程,再在根目录执行 mvn archetype:create-from-project 命令即可根据这个工程生成它的脚手架原型,路径是执行命令的目录下 target/generated-sources/archetype目录。这个目录就是脚手架的maven工程,然后再根据情况调整。

工程编辑

首先对 META-INF/maven/archetype-metadata.xml 的主要参数解释

<!--  参数  -->
<requiredProperties> 
    <requiredProperty key="appName">
    	<defaultValue>defaultapp</defaultValue>
    </requiredProperty>
    	<requiredProperty key="projectName">
    <defaultValue>${appName}</defaultValue>
    	</requiredProperty>
    <requiredProperty key="groupId">
    	<defaultValue>cn.tanzhou.${appName}</defaultValue>
    </requiredProperty>
</requiredProperties>
<!--  fileSets是脚手架创建工程时会生成 archetype-resources 目录下的哪些文件 -->
<fileSets> 
<!--  filtered是要创建的文件中的占位符变量需要替换  encoding是文件的编码格式 packaged设置false可以防止 directory 属性内的文件路径下创建__packageInPathFormat文件夹-->
    <fileSet filtered="true" encoding="UTF-8" packaged="false">
        <!-- 相对路径 按照上面图片这个路径指的是archetype-resources 目录下 -->
        <directory></directory>
        <!-- 要生成的文件 -->
        <includes>
            <include>pom.xml</include>
        </includes>
    </fileSet>
</fileSets>
<!-- module是指子工程 id是工程的artifactId在多层嵌套下用.表示层级 dir是目录在多层嵌套下用/表示层级,name是子工程的的名称在多层嵌套下用.表示层级-->
<module id="origin-web" dir="web" name="origin-web">
    <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
            <!-- 相对路径 按照上面图片这个路径指的是archetype-resources/web/src/main/java 目录下 -->
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/**</include>
            </includes>
        </fileSet>
    </fileSets>
</module>

关于参数的占位符使用

  • 在xml文件内关于参数使用通过${参数变量}, 也可以用__参数变量__方式
  • 文件夹上使用参数的方式是__参数变量__方式
  • 在 java 文件内使用参数的方式是${参数变量}

工程使用

首先将调整好的 maven 脚手架工程执行 mvn install 打包构建到本地仓库,或者执行 mvn deploy 打包构建到远程私有库上 (本章没讲 deploy 上传配置)

第一种使用方式:idea可以导入自定义脚手架 仅需要填写 GroupId(在maven仓库内的包路径),ArtifactId(在包路径目录下的文件名),Version(版本号),通过以上参数就可以定位准确了。Repository是指第三方maven仓库,比如私有库地址。但这样支持自定义其它参数的脚手架将难以使用。

image-20210507221826329

第二种:通过maven命令创建项目。相比idea更加灵活一些

mvn archetype:generate //表示要创建一个maven工程
-DinteractiveMode=false //表示不是交互模式,不用选择
-DarchetypeCatalog=internal //联网模式 还有local表示使用本地仓库
-DarchetypeRepository=http://xxx/maven-public/ //设置源
-DarchetypeGroupId=cn.com.cs //模板所在的组
-DarchetypeArtifactId=service-template //模板的id
-DarchetypeVersion=1.2.0-SNAPSHOT //版本
-DgroupId =com.cn //项目造出来后java文件夹下的路径组(这个项目打包后这就是maven仓库的文件路径)
-DartifactId=xirizhi-web //项目的名字id(这个项目打包后就是 GroupId 路径下的文件名字)
-DappName=xxx //自定义的appName的参数
...

Maven上传包到私库

maven 的setting.xml 文件内配置

<servers>
    <server>
        <id>snapshots</id>
        <username>admin</username>
        <password>123456</password>
    </server>
    <server>
        <id>releases</id>
        <username>admin</username>
        <password>123456</password>
    </server>
</servers>
<profiles>
    <profile>
        <!--  为这个私库配置定义一个id  -->
        <id>new</id> 
        <repositories>
            <repository>
            	<!--  这个id对应上面的账号id  -->
                <id>release</id>
                <!--  私库路径  -->
                <url>http://xxx:8888/repository/tzedu-cs-arch-release/</url>
                <!--  是否可推送正式包  -->
                <releases>
                    <enabled>true</enabled>
                </releases>
                <!--  是否可推送快照包(固定的.SNAPSHOT文件名结尾的.jar) -->
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>snapshot</id>
                <url>http://xxx:8888/repository/tzedu-cs-arch-snapshot/</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    </profile>
</profiles>
<!--  默认使用哪个配置  -->
<activeProfiles>
    <activeProfile>new</activeProfile>
</activeProfiles>

在项目pom文件内配置(不知道在 maven 工程配置内账号密码怎么搞)

<distributionManagement>
    <!--  配置正式包私库源  -->
    <repository>
    	<!--  id对应maven仓库setting文件内配置的账号server的id  -->
        <id>releases</id>
        <url>http://xxx:8888/repository/tzedu-cs-arch-release/</url>
    </repository>
    <!--  配置快照包私库源  -->
    <snapshotRepository>
    	<!--  id对应maven仓库setting文件内配置的账号server的id  -->
        <id>snapshots</id>
        <url>http://xxx:8888/repository/tzedu-cs-arch-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

题外:多模块构建时,可在不需要上传私库的模块下 pom 文件内配置一下

<properties>
    <maven.deploy.skip>true</maven.deploy.skip>
</properties>

Maven自定义脚手架推荐其它教程

多看几篇你就懂了

总结

maven的自定义脚手架其实也不难嘛~(来自懂王的蜜汁自信)