自定义Maven Archetype 骨架快速创建工程

278 阅读3分钟

本篇文章旨在帮助大家手把手一次性完成构建Maven脚手架的教程。跟着做不出错,如果出现新问题,评论区留言,做出修正和回答。

一、创建模版工程

1、创建工程

创建模版工程和大家平时创建工程是一样的,无论是单Module还是多Module。

我创建的:gitee.com/xxjxiexueji…


├─template-project
    ├─template-common // 存放常量、枚举、异常、工具类......
    ├─template-dao    // 存放持久化层交互的mapper
    ├─template-manager// 技术层面的service、缓存工具、依赖三方的service、AOP
    ├─template-rpc 	  // 堆外提供的RPC接口、请求参数、响应参数
    ├─template-service// 业务级层面的service(对逻辑的编排)。定时任务、MQ(发布、订阅)。
    └─template-web    // 全局配置类、全局异常处理类、过滤器、拦截器、启动器......
    └─pom.xml

2、在父POM中添加插件

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

     <pluginManagement>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-archetype-plugin</artifactId>
                 <version>3.2.0</version>
             </plugin>
         </plugins>
     </pluginManagement>
</build>

这两个插件是必须的。

!!! 确保自己的模版工程是能正常打包的

父POM详情(不必须,可借鉴):

因为我这里的工程是空的,没有添加太多依赖,只保证工程能正常打包,大家在制作自己工程时,自己配置。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xxj</groupId>
    <artifactId>template-project</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>
    <modules>
        <module>template-common</module>
        <module>template-dao</module>
        <module>template-manager</module>
        <module>template-service</module>
        <module>template-rpc</module>
        <module>template-web</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>

        <springboot.version>2.3.5.RELEASE</springboot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.36</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${springboot.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-bom</artifactId>
                <version>5.8.38</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>*/**</include>
                </includes>
            </resource>
        </resources>

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

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-archetype-plugin</artifactId>
                    <version>3.2.0</version>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${springboot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

二、创建骨架

2.1、配置Maven环境变量

确保你的maven已经添加到了环境变量!!!

不知道怎么配的,自行百度!!!

最终目标:可以正常执行mvn命令

2.2、编译骨架

进入到你模版工程的根目录下。

我的目录是D:\ideaworkspace\template-project

PS D:\ideaworkspace\template-project> pwd

Path
----
D:\ideaworkspace\template-project

在模版工程的父POM同级目录下执行命令:mvn archetype:create-from-project

PS D:\ideaworkspace\template-project> mvn archetype:create-from-project

可能会遇见以下问题,看自己情况:

先不管为什么,把你的settings.xml文件复制到C:\Users\*\.m2\settings.xml位置,即可解决。

成功之后会出现如下的目录层级:

├── target

│   └── generated-sources

│   └── archetype

│   ├── pom.xml

│   ├── src

│   │   └── main

│   │   └── resources

│   │   ├── META-INF

│   │   │   └── maven

│   │   │   └── archetype-metadata.xml

│   │   └── archetype-resources

2.3、修改骨架配置

下面说的修改文件,和你的源代码工程没有任何关系,都是target/generated-sources/archetype/目录下的!!!

1、修改骨架的名称

这个不是必须项,看你自己!!!

操作:

进入到targer/generated-sources/archetype/pom.xml

artifactId和name,默认会加archetype,可调整。

2、修改子模块的目录名

我们进入到 target/generated-sources/archetype/src/main/resources/archetype-resources/目录下,会看到自己的子Module,在这里可以修改子Module的名称(我说的是目录的名称)。

修改格式,必须,否则你会失败!!!

每个模块的q前缀都加上:__rootArtifactId__ (注意:双下划线)

这是maven官方要求的。

我修改之后的样子:

3、修改父pom.xml 文件

1、先检查pom文件的gav是否存在下面内容,没有就加上或修改:

<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<packaging>pom</packaging>
<version>${version}</version>
<name>${artifactId}</name>

2、模版工程中的父POM文件中,集成自己的子模块依赖:

target/generated-sources/archetype/src/main/resources/archetype-resources/pom.xml 中添加子模块管理

格式:

<module>${rootArtifactId}-模块一</module>

<module>${rootArtifactId}-模块二</module>

<module>${rootArtifactId}-模块三</module>

......

也是只能改中文,改为自己的

我添加的:

<modules>
    <module>${rootArtifactId}-common</module>
    <module>${rootArtifactId}-dao</module>
    <module>${rootArtifactId}-manager</module>
    <module>${rootArtifactId}-service</module>
    <module>${rootArtifactId}-rpc</module>
    <module>${rootArtifactId}-web</module>
</modules>

3、父POM中集成管理子模块的依赖:

格式:

<groupId>${groupId}</groupId>

<artifactId>${rootArtifactId}-模块一</artifactId>

<version>${project.version}</version>
<groupId>${groupId}</groupId>

<artifactId>${rootArtifactId}-模块二</artifactId>

<version>${project.version}</version>

我修改的:

<dependencyManagement>
    <dependencies>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-common</artifactId>
          <version>${project.version}</version>
      </dependency>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-dao</artifactId>
          <version>${project.version}</version>
      </dependency>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-manager</artifactId>
          <version>${project.version}</version>
      </dependency>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-service</artifactId>
          <version>${project.version}</version>
      </dependency>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-rpc</artifactId>
          <version>${project.version}</version>
      </dependency>
      <dependency>
          <groupId>${groupId}</groupId>
          <artifactId>${rootArtifactId}-web</artifactId>
          <version>${project.version}</version>
      </dependency>
  </dependencies>
</dependencyManagement>

4、修改子模块pom.xml文件

1、每个子模块修改或添加:

<artifactId>${artifactId}</artifactId>
<packaging>jar</packaging>
<name>${artifactId}</name>

2、修改各个子模块的依赖引用:

子模块之间相互引用关系修改,格式如下:

<dependency>
    <groupId>${groupId}</groupId>
    <artifactId>${rootArtifactId}-模块一</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>${groupId}</groupId>
    <artifactId>${rootArtifactId}-模块二</artifactId>
    <version>${project.version}</version>
</dependency>

照猫画虎,也是只改中文

如:

 <dependency>
      <groupId>com.xxj</groupId>
      <artifactId>${rootArtifactId}-common</artifactId>
      <version>${project.version}</version>
  </dependency>

  <dependency>
      <groupId>${groupId}</groupId>
      <artifactId>${rootArtifactId}-dao</artifactId>
      <version>${project.version}</version>
  </dependency>

  <dependency>
      <groupId>${groupId}</groupId>
      <artifactId>${rootArtifactId}-manager</artifactId>
      <version>${project.version}</version>
  </dependency>

  <dependency>
      <groupId>${groupId}</groupId>
      <artifactId>${rootArtifactId}-rpc</artifactId>
      <version>${project.version}</version>
  </dependency>

  <dependency>
      <groupId>${groupId}</groupId>
      <artifactId>${rootArtifactId}-service</artifactId>
      <version>${project.version}</version>
  </dependency>

5、修改骨架的配置文件

修改archetype-metadata.xml配置,位于target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml

修改内容格式:注意id、dir、name 是不一样的

修改结果:

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd" name="template-project"
    xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <fileSets>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>.idea</directory>
      <includes>
        <include>**/*.xml</include>
      </includes>
    </fileSet>
    <fileSet encoding="UTF-8">
      <directory>.idea</directory>
      <includes>
        <include>**/*.gitignore</include>
      </includes>
    </fileSet>
  </fileSets>
  <modules>
    <module id="${rootArtifactId}-common" dir="__rootArtifactId__-common" name="${rootArtifactId}-common">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    <module id="${rootArtifactId}-dao" dir="__rootArtifactId__-dao" name="${rootArtifactId}-dao">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    <module id="${rootArtifactId}-manager" dir="__rootArtifactId__-manager" name="${rootArtifactId}-manager">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    <module id="${rootArtifactId}-service" dir="__rootArtifactId__-service" name="${rootArtifactId}-service">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    <module id="${rootArtifactId}-rpc" dir="__rootArtifactId__-rpc" name="${rootArtifactId}-rpc">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    <module id="${rootArtifactId}-web" dir="__rootArtifactId__-web" name="${rootArtifactId}-web">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
        <fileSet encoding="UTF-8">
          <directory>src/main/resources</directory>
          <includes>
            <include>**/*.yml</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
  </modules>
</archetype-descriptor>

2.4、生成骨架

进入target/generated-sources/archetype目录。

执行mvn clean install 等待成功的提示。

三、使用骨架

通过命令行创建骨架!!!

1、找一个空目录!!!不然会出错

执行mvn archetype:generate -DarchetypeCatalog=local命令

进行选择编号、GAV、包名。

2、成功

四、发布推送骨架

这个不是必须,看自己情况!!!

4.1、部署到公司私服

配置公司私服默认你已经配置好了。

执行命令:

mvn deploy:deploy-file -Dfile=jar名称 -DgroupId=jar包groupId -DartifactId=jar包artifactId –Dversion=jar包版本号 -Dpackaging=jar –Durl=私服地址 -DrepositoryId=私服ID

4.2、部署到maven中央仓库

这里我没有试过!!!

参考:www.cnblogs.com/ykbb/p/1789…

mvn deploy

使用:

mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -Dfilter=archetype-all -DarchetypeCatalog=仓库地址

五、idea管理骨架

采用idea基于maven骨架创建工程。

5.1、添加骨架

1、配置gav:

我的:

<artifactId>template-project</artifactId>
<groupId>com.xxj</groupId>
<version>1.0</version>

repository如果是远程,把远程地址贴上。

2、使用idea添加的骨架创建工程:

遇见了一个问题,顺便说一下。

问题计入说明:

使用的版本过低,如下图所示,我用的maven 3.5.0

创建过程中,选择3.6.3版本,即可创建成功。

5.2、删除骨架

找到目录:C:\Users\xxjxi\AppData\Local\JetBrains\IntelliJIdea2021.1\Maven\Indices\UserArchetypes.xml

修改文件(如果找不到文件,使用文件检索工具,win是everything工具进行检索UserArchetypes.xml文件):

<archetypes>
  <!-- 删除这一行即可 -->
  <archetype groupId="com.xxj" artifactId="template-project" version="1.0" />
</archetypes>

重启idea即可。

六、参考资料

  1. perkins4j2.github.io/posts/72500…
  2. www.runoob.com/maven/proje…