# 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 archetype tips
  • 基于 maven 的项目脚手架,一键创建项目的项目模板

# 总结

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