十四、archetype

作者: 小炼君 | 来源:发表于2017-08-30 23:20 被阅读125次

    本章是《maven实战》最后一章啦,十四章走来,每天都在坚持,同时也简单的记录了自己每一天的点点滴滴,感谢大家支持,我会继续走下去,希望能在今后给大家带来更加精彩的故事
    接下来我准备向《高性能MySQL》进军啦,可能过程中笔记更新会不定期,但是我还是会按照章节的方式记录每一章重点并呈现给大家,所以前方路途虽远,但坚持就是胜利,一起加油吧!!!

    forgive.jpg

    可以把archetype当做一个模板,当我们要创建一些项目的时候,可以通过简单的maven命令就可以快速生成项目的骨架

    使用archetype的一般步骤

    交互式

    mvn archetype:generate,mvn会列出一个列表供用户选择

    archetype项目列表.png

    这个列表来自archetype-catalog.xml文件,在后续操作中,用户需要提供一些通用的基本参数,主要有groupId,artifactId,version,package,这样archetype插件就可以生成项目的骨架了

    批处理方式

    批处理方式不同在于使用上述命令时直接把参数给出来,同时使用-B参数要求archetype插件以批处理的方式运行,不过需要用户显示给出archetype的坐标信息

    mvn archetype:generate -B \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=1.0 \
    -DgroupId=com.zheng.mavenstudy\
    -DartifactId=archetype-test \
    -Dversion=1.0-SNAPSHOT \
    -Dpackage=com.zheng.mavenstudy
    

    常用的archetype介绍

    maven-archetype-quickstart默认值 常用于一般javase项目结构
    maven-archetype-webapp 用于web项目架构
    appfuse archetype
    appfuse是一个集成了很多开源工具的项目,在于帮助程序员快速高效的创建项目,它提供了大量archetype,方便用户使用各种类型的项目

    编写自己的archetype项目

    一个archetype-maven项目需要包含以下几个重要部分
    pom.xml archetype自身的pom
    src/main/resources/archetype-resources/pom.xml 基于该archetype生成的项目pom原型
    src/main/resources/META-INF/maven/archetype-metadata.xml archetype的描述符文件
    src/main/resources/archetype-resources/ 其他需要包含在archetype项目中的内容
    基本结构如下

    自定义archetype项目结构.png

    archetypepom.xml文件,用于定义archetype项目的坐标
    archetype-test/pom.xml

    <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.zheng.archetypestudy</groupId>
      <artifactId>archetype-test</artifactId>
      <version>1.0-SNAPSHOT</version>
    </project>
    

    生成的项目pom.xml
    用于描述生成项目中包含的一些配置,包括参数、依赖等,其中groupId,artifactId,version使用了属性替换
    文件位于archetype-test/src/main/resources/archetype-resources/pom.xml

    <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>${groupId}</groupId>
        <artifactId>${artifactId}</artifactId>
        <version>${version}</version>
        <packaging>jar</packaging>
        <name>${artifactId}</name>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
        <build>
            <pluginManagement>
                <plugins>
                    <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>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>2.6</version>
                        <configuration>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    archetype-metadata.xml文件,用于描述archetype项目哪些文件夹及目录需要被引入到项目中
    位于
    archetype-test/src/main/resources/META-INF/maven/archetype-metadata.xml
    其中通过fileSets设置了需要被用于项目中的文件,通过filtered,packaged分别设置指定目录下包含的文件是否需要属性值替换,同时对应的目录是否需要生成包目录

    <?xml version="1.0" encoding="UTF-8"?>
    <archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd"
                       xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        
        <fileSets>
            <fileSet filtered="true" packaged="true">
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.java</include>
                </includes>
            </fileSet>
            <fileSet filtered="true" packaged="true">
                <directory>src/test/java</directory>
                <includes>
                    <include>**/*.java</include>
                </includes>
            </fileSet>
            <fileSet filtered="true" packaged="false">
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </fileSet>
        </fileSets>
        <requiredProperties>
            <requiredProperty key="groupId">
                <defaultValue>com.zheng.archetypestudy</defaultValue>
            </requiredProperty>
        </requiredProperties>
    </archetype-catalog>
    

    上面配置的src/main/java,src/test/java,src/main/resources,分别指向目标项目的src/main/java,src/test/java,src/main/resources
    对应于archetype-test项目的
    archetype-test/src/main/resources/archetype-resources/src/main/java
    archetype-test/src/main/resources/archetype-resources/src/test/java
    archetype-test/src/main/resources/archetype-resources/src/main/resources
    其中配置的src/main/java目录,采用通配符方式包含所有当前包及其子包下的java文件,最终出现在目标项目project-name/src/main/java/[package-name]/**/*.java

    自定义的一些项目文件
    archetype-test/src/main/resources/archetyperesources/src/main/java/dao/BaseDao.java

    package ${package}.dao;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * 基础数据接口
     * Created by zhenglian on 2017/8/21.
     */
    public interface BaseDao<T> {
        void save(T t);
        void update(T t);
        int delete(Serializable id);
        T findById(Serializable id);
        List<T> findAll();
    }
    

    注意上面package引入通过${package}变量名方式,这样可以通过在命令行时动态指定,结合上面所提供的archetype-metadata.xml配置,对指定文件进行变量替换
    archetype-test/src/main/resources/archetype-resources/src/main/java/service/BaseService.java

    package ${package}.service;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * 基础服务接口
     * Created by zhenglian on 2017/8/21.
     */
    public interface BaseService<T> {
        void save(T t);
        void update(T t);
        int delete(Serializable id);
        T findById(Serializable id);
        List<T> findAll();
    }
    

    配置完成后,项目总体结构如上面给出的图所示,通过mvn clean installarchetype项目打包到本地仓库中
    如此就可以通过mvn archetype:generate命令使用本地创建的archetype项目架构了
    mvn archetype:generate -DarchetypeGroupId=com.zheng.archetypestudy -DarchetypeArtifactId=archetype-test -DarchetypeVersion=1.0-SNAPSHOT

    注意在运行该命令的时候,如果是在archetype-test项目根目录下,那么会报错,提示Unable to add module to the current project as it is not of packaging type 'pom',说明当前创建的项目为模块项目,而父级目录不是一个pom类型的项目,所以报错
    在上一级目录下运行即可

    自定义archetype运行结果.png

    archetypeCatalog

    在使用maven-archetype-plugin插件时,会得到一个列表供选择,这个列表的信息来源于一个名为archetype-catalog.xml的文件
    用户可以自定义这个archetype-catalog.xml中的内容,当然也可以通过扫描本地仓库自动生成基于该仓库的archetype-catalog.xml文件
    那么archetype-catalog.xml配置文件是从哪里来的呢,maven中有以下几种选择:
    internal maven内置的archetypeCatalog
    local 指向用户本地的archetype catalog,其位置为C:\Users\Administrator\.m2\archetype-catalog.xml,但是该文件默认是不存在的
    remote 指向了maven中央仓库的archetype catalog,具体地址为http://repo1.maven.org/maven2/archetype-catalog.xml
    file://... 用户可以指定本机任何位置的archetype-catalog.xml文件
    http://... 用户可以使用http协议指定远程的archetype-catalog.xml文件
    上面几种方式可以通过mvn archetype:generate命令的时候,使用archetypeCatalog指定插件使用的catalog,例如:
    mvn archetype:generate -DarchetypeCatalog=local

    使用本机archetypecatalog.png

    上面的local指定使用C:\Users\Administrator\.m2\archetype-catalog.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd"
        xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <archetypes>
        <archetype>
          <groupId>org.apache.maven.archetypes</groupId>
          <artifactId>maven-archetype-mojo</artifactId>
          <version>1.0</version>
          <description>plugin</description>
        </archetype>
        <archetype>
          <groupId>org.apache.maven.archetypes</groupId>
          <artifactId>maven-archetype-quickstart</artifactId>
          <version>1.0</version>
          <description>quickstart</description>
        </archetype>
        <archetype>
          <groupId>org.apache.maven.archetypes</groupId>
          <artifactId>maven-archetype-quickstart</artifactId>
          <version>1.1</version>
          <description>quickstart</description>
        </archetype>
        <archetype>
          <groupId>org.apache.maven.archetypes</groupId>
          <artifactId>maven-archetype-webapp</artifactId>
          <version>1.0</version>
          <description>webapp</description>
        </archetype>
        <archetype>
          <groupId>org.appfuse.archetypes</groupId>
          <artifactId>appfuse-modular-spring</artifactId>
          <version>2.0</version>
          <description>appfuse-modular-spring</description>
        </archetype>
      </archetypes>
    </archetype-catalog>
    

    上面的archetype-catalog.xml是通过扫描本地仓库自动生成的,可以通过mvn archetype:crawl来浏览当前本地仓库的项目结构,默认会生成到本地仓库(localRepository)配置的根目录下
    当然也可以通过-Drepository指定本地仓库位置,-Dcatalog指定生成的archetype-catalog.xml生成的方式
    mvn archetype:crawl -Drepository=G:/workspace/repository -Dcatalog=C:/Users/Administrator/.m2/archetype-catalog.xml
    如果没有指定-Drepository参数时,maven会通过settings.xml中配置的本地仓库进行解析

    通过学习上面,我相信大家应该可以通过自定义自己的archetype来生成属于自己的项目骨架啦,赶紧动起来吧!

    相关文章

      网友评论

        本文标题:十四、archetype

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