美文网首页
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