Maven自定义项目初始化框架

498 阅读2分钟

脚手架项目初始化

  1. 使用IDEA创建一个Maven项目,并创建多个模块 image.png
  2. 在 silver-gravel-framework项目中的pom.xml配置如下:
<groupId>com.silvergravel</groupId>  
<artifactId>silver-gravel-framework</artifactId>  
<version>1.0.0-SNAPSHOT</version>  
<packaging>pom</packaging>  
<parent>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-parent</artifactId>  
    <version>3.2.6</version>  
</parent>  
<modules>  
    <module>silver-gravel-api</module>  
    <module>silver-gravel-service</module>  
</modules>  
  
<properties>  
    <maven.compiler.source>17</maven.compiler.source>  
    <maven.compiler.target>17</maven.compiler.target>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    <mybatis-flex.version>1.9.0</mybatis-flex.version>  
    <postgredql.version>42.7.3</postgredql.version>  
    <lombok.version>1.18.26</lombok.version>  
</properties>  
<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>com.mybatis-flex</groupId>  
            <artifactId>mybatis-flex-dependencies</artifactId>  
            <version>${mybatis-flex.version}</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
        <dependency>  
            <groupId>org.projectlombok</groupId>  
            <artifactId>lombok</artifactId>  
            <version>${lombok.version}</version>  
            <scope>provided</scope>  
        </dependency>  
        <dependency>  
            <groupId>com.silvergravel</groupId>  
            <artifactId>silver-gravel-api</artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
        </dependency>  
        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->  
        <dependency>  
            <groupId>org.postgresql</groupId>  
            <artifactId>postgresql</artifactId>  
            <version>${postgredql.version}</version>  
        </dependency>  
  
    </dependencies>  
</dependencyManagement>  
<build>  
    <finalName>silver-gravel-framework</finalName>  
    <extensions>  
        <extension>  
            <groupId>org.apache.maven.archetype</groupId>  
            <artifactId>archetype-packaging</artifactId>  
            <version>3.2.1</version>  
        </extension>  
    </extensions>  
    <plugins>  
       <plugin>  
           <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-archetype-plugin -->  
           <groupId>org.apache.maven.plugins</groupId>  
           <artifactId>maven-archetype-plugin</artifactId>  
           <version>3.2.1</version>  
       </plugin>  
    </plugins>  
</build>  
<distributionManagement>  
    <snapshotRepository>  
        <id>maven-snapshots</id>  
        <url>http://192.168.137.244:9010/repository/maven-snapshots</url>  
    </snapshotRepository>  
</distributionManagement>

主要是:<build>标签中的两个插件,其余为其他项目父工程的配置文件。

  1. 创建archetype.properties文件,内容如下:
# 定义脚手架的版本 archetype.groupId=com.silvergravel  
archetype.artifactId=silver-gravel-framework  
archetype.version=1.0.0-SNAPSHOT  
excludePatterns=**/.idea/**,**/*.iml  
# 自定义属性,用于规则匹配替换指定文本内容,或文件夹名称
appName=Basic  
  1. silver-gravel-framework执行mvn archetype:create-from-project image.png

  2. 生成了target文件夹,内容如下: image.png

项目配置

如上文最后图所示,target只保留文件,没有保留没有内容的文件夹,想保留文件夹可以在META-INF文件下的archetype-metadata.xml中添加配置:

image.png

 <fileSets>  
  <fileSet encoding="UTF-8" filtered="true">  
    <directory></directory>  
    <includes>  
      <include>.gitignore</include>  
      <include>Dockerfile</include>  
      <include>README.md</include>  
    </includes>  
  </fileSet>  
</fileSets>  
<modules>  
  <module id="${rootArtifactId}-api" dir="__rootArtifactId__-api" name="${rootArtifactId}-api">  
    <fileSets>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/api</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/dto</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>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/aop</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/config</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/controller</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/domain</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/mapper</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/service</directory>  
        <includes>  
          <include>**/*.java</include>  
        </includes>  
      </fileSet>  
      <fileSet filtered="true" encoding="UTF-8">  
        <directory>src/main/java/__packageInPathFormat__/format/util</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.properties配置了该属性,那么初始化就出现,建议所有定义属性都预先配置,减少后续还要在test文件下配置测试的属性-->
    <requiredProperties>
        <requiredProperty key="appName">
            <defaultValue>Basic</defaultValue>
        </requiredProperty>
    </requiredProperties>

这里注意<fileSet>标签,每一个<fileSet>内都有一个<directory>标签,在生成新项目的时候会对应的生成指定的文件夹,如:<directory>src/main/java/__packageInPathFormat__/format/api</directory>

则会在 ${rootArtifactId}-api模块下生成src/main/java/新项目的groupId.转成//format/api的文件夹。从这里可以发现有两种替换模板的格式

  • ${}:用于替换文件中的内容
  • __property__:用于替换文件名称或者文件夹名称

<fileSet>有以下属性,尤其是filtered属性:

属性描述
encoding设置文件编码
fitered表示指定的内容是否启用占位符替代文本,true表示启用占位符
packaged是否在每个文件夹之后添加新项目groupId文件夹

Maven中提供了以下几种属性:

属性描述
rootArtifactId它保存用户输入的值作为项目名(maven在用户运行原型时在提示符中询问为artifactid:的值
artifactId如果项目由一个模块组成,则此变量的值将与${rootArtifactId}相同,但如果项目包含多个模块,则此变量将由每个模块文件夹中的模块名替换
package用户为项目提供的包,也在用户运行原型时由maven提示
packageInPathFormat与package变量的值相同,但将“.”替换为字符“/”,例如:,对于包com.silvergravel,此变量为com/silvergravel
groupId用户为项目提供的groupid,在用户运行原型时由maven提示
version版本号

<module>标签中有以下几个属性

属性描述
id子模块工程的artifactId
dir子模块工程源文件在archetype-resources里对应的`directory
name子模块的名字.,可定制化自己的服务模块。

接下来就是配置target如下图所示,文件夹,文件名使用__property__,文件内容使用${property},图中的pom.xml文件中加上module,删除build新项目不要插件内容 image.png

进入targetarchetype文件夹执行mvn install

image.png

执行成功之后,在本地Maven仓库中有archetype-catalog.xml文件,里面记录了脚手架的版本,如果后续不使用,直接删掉该文件内容并删除对应项目即可。

image.png

上传到私服命令:

mvn deploy  -DaltDeploymentRepository=maven-snapshots::http://192.168.137.244:9010/repository/maven-snapshots/ 

使用脚手架创建项目

Maven

打开一个空文件夹执行以下命令

mvn archetype:generate -B -DarchetypeGroupId=com.silvergravel -DarchetypeArtifactId=silver-gravel-framework -DarchetypeVersion=1.0.0-SNAPSHOT -DgroupId=org.example -DartifactId=demo -Dversion=1.0.1-SNAPSHOT -DappName=Demo

image.png

image.png

IDEA

image.png image.png 输入脚手架项目,添加arhetype-catalog.xml路径