本章是《maven实战》最后一章啦,十四章走来,每天都在坚持,同时也简单的记录了自己每一天的点点滴滴,感谢大家支持,我会继续走下去,希望能在今后给大家带来更加精彩的故事
接下来我准备向《高性能MySQL》进军啦,可能过程中笔记更新会不定期,但是我还是会按照章节的方式记录每一章重点并呈现给大家,所以前方路途虽远,但坚持就是胜利,一起加油吧!!!
可以把archetype
当做一个模板,当我们要创建一些项目的时候,可以通过简单的maven
命令就可以快速生成项目的骨架
使用archetype的一般步骤
交互式
mvn archetype:generate
,mvn
会列出一个列表供用户选择
这个列表来自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
的pom.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 install
将archetype
项目打包到本地仓库中
如此就可以通过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
类型的项目,所以报错
在上一级目录下运行即可
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
上面的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
来生成属于自己的项目骨架啦,赶紧动起来吧!
网友评论