美文网首页
Maven Archetype开发(一)

Maven Archetype开发(一)

作者: 随风摇摆水杉树 | 来源:发表于2020-06-26 19:15 被阅读0次

    一、Archetype简介

    Archetype是Maven的项目模板工具包,开发者可以根据archetype模板导出一个maven骨架项目,然后在此项目上进行开发。使用过maven的开发者都知道,eclipse新增maven项目的时候都会弹出一个项目设置向导,这个向导背后的技术支持就是archetype。

    二、开发自己的Archetype

    虽然maven内部提供了不少archetype模板,但是很多模板都是一些基础性的例子,用来学习还行,如果要用在实际开发项目中就显得比较鸡肋。另外每家公司都有自己的开发习惯、代码风格、代码结构、业务代码等,很多模板无法直接套用,因此开发一套自己的archetype模板才有实际意义。

    三、Archetype模板项目基本结构

    archetype
    |-- pom.xml
    `-- src
        `-- main
            `-- resources
                |-- META-INF
                |   `-- maven
                |       `--archetype-metadata.xml
                `-- archetype-resources
                    |-- pom.xml
                    `-- src
                        |-- main
                        |   `-- java
                        |       `-- App.java
                        `-- test
                            `--java
                                `-- AppTest.java
    

    Archetype模板项目跟普通项目一样也是一个maven项目,但是它的目录结构要稍复杂些。一般一个archetype模板项目必须要包含以下文件:

    • pom.xml
    • archetype-metadata.xml
    • archetype-resources/
      archetype模板项目的pom.xml跟普通maven项目一样,也需要设置groupId、artifactId、version、packaging等元素。
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
     
      <groupId>my.groupId</groupId>
      <artifactId>my-archetype-id</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>maven-archetype</packaging>
     
      <build>
        <extensions>
          <extension>
            <groupId>org.apache.maven.archetype</groupId>
            <artifactId>archetype-packaging</artifactId>
            <version>3.1.1</version>
          </extension>
        </extensions>
      </build>
    </project>
    

    需要注意的是archetype模板项目的打包类型并没有规定必须是maven-archetype,你定义成jar也是没关系的。至于为什么要定义成maven-archetype,可以参看maven官方的Maven Archetype Packaging教程

    四、Archetype描述文件

    Archetype描述文件也就是上面提到过的archetype-metadata.xml,下面我们来看一下该文化所包含的内容:

    <archetype-descriptor
            xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0
            https://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
            xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="quickstart">
        <fileSets>
            <fileSet filtered="true" packaged="true">
                <directory>src/main/java</directory>
            </fileSet>
            <fileSet>
                <directory>src/test/java</directory>
            </fileSet>
        </fileSets>
    </archetype-descriptor>
    

    该文件主要包含了fileSets这个元素,一个fileSets又可包含一个或者多个fileSet子元素,每一个fileSet元素下定义了一个directory目录元素,它最终会指向archetype-resources/目录下的子目录。fileSet有两个属性filteredpackaged

    • filtered表示是否对directory指定的目录中的文件应用属性替换,比如src/main/java目录下的App.java这个文件,其中使用了String name = "${X}";这样一段代码,然后开发者通过命令或者eclipse从该archetype模板项目导出骨架项目的时候会输入X的具体替换内容,最终导出后name的值就是你所替换的内容。
    • packaged表示是否将该目录下的内容放到生成项目的包路径下。比如开发者从该archetype模板项目导出骨架项目的时候,设置package=com.start.archetype,如果package=true,那么最终生成的项目目录为src/main/java/com/start/archetype/App.java,反之目录为src/main/java/App.java。一般对于java文件设置为package=true,对于properties等配置文件设置为package=false
      archetype-metadata.xml文件中各个元素的详细解释请参考Archetype-Descriptor教程

    五、模板文件

    既然是Archetype模板项目,那么模板在哪里呢?答案是archetype-resources/目录,该目录下包含了一个完整maven项目,当然它跟普通的maven项目还是有些区别的。

    • 从Archetype模板项目基本结构中我们可以看出, archetype-resources/src/main/java/App.java是没有基础包名的。比如你有一个正常的mave项目,其java目录结构如下:
        simple-project
        |-- pom.xml
        `-- src
            |-- main
                `-- java
                    `-- com
                         `-- simple
                             |-- App.java
                             `-- service
                             |   `--TestService.java
                             `-- dao
                                  `--TestDao.java
    

    假设基础包名为com.simple,那么archetype-resources目录下的java目录结构应改为:

        simple-project
        |-- pom.xml
        `-- src
            |-- main
                `-- java
                    |-- App.java
                    `-- service
                    |   `--TestService.java
                    `-- dao
                        `--TestDao.java
    
    • 除了目录结构外,java文件中的包名也需要通过Maven Archetype变量进行替换,具体如下:
    package ${package};
    
    public class App {
       ....
       ....
    }
    
    package ${package}.service;
    
    public class TestService {
       ....
       ....
    }
    
    package ${package}.dao;
    
    public class TestDao {
       ....
       ....
    }
    

    从上面的代码中我们可以看出,基础包名com.simple都被${package}这个Maven Archetype变量替换了,它的作用就是当开发者从该archetype导出一个新的骨架项目的时候,假如package=com.simple.new,那么导出的java文件中${package}会替换为com.simple.new。

    六、导出骨架项目

    1、使用mvn install安装Archetype模板项目本身
    2、使用mvn archetype:generate导出骨架项目

    mvn archetype:generate                                  \
      -DarchetypeGroupId=<archetype-groupId>                \
      -DarchetypeArtifactId=<archetype-artifactId>          \
      -DarchetypeVersion=<archetype-version>                \
      -DgroupId=<my.groupid>                                \
      -DartifactId=<my-artifactId>
    

    3、如果你对于手动编写以上文件有点反感,那么你可以使用maven官方提供的用来生成Archetype模板项目的Archetype:

    mvn archetype:generate
      -DgroupId=[your project's group id]
      -DartifactId=[your project's artifact id]
      -DarchetypeGroupId=org.apache.maven.archetypes
      -DarchetypeArtifactId=maven-archetype-archetype
    

    七、参考源码

    https://gitee.com/jack_junjie/demo-start-archetype,这个源码是我自己编写的案例,文件名称略有不同,但是思路是一样的。

    八、参考资源

    更多

    Maven Archetype开发(二)

    相关文章

      网友评论

          本文标题:Maven Archetype开发(一)

          本文链接:https://www.haomeiwen.com/subject/tabyfktx.html