十四、archetype

本章是《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来生成属于自己的项目骨架啦,赶紧动起来吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容