此篇主要来谈谈maven自定义archetype,maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,此篇就不再深究maven的概念问题,侧重点来聊聊如何自定义archetype。
0x01 为什么要自定义archetype
maven也内置了很多的archetype供用户选择使用什么样的骨架去创建一个项目,比如:
maven-archetype-webapp
maven-archetype-quickstart
在创建一个maven项目的时候会列出很多archetype供选择,maven默认的archetype是maven-archetype-webapp。
但是在一个团队做开发的过程中,可能仅仅依靠maven预先提供的archetyp可能是不够的,团队之间协作有自己的定义方式,每个人的结构定义风格也不尽相同,在这样的背景下我们有必要去定义一个统一的代码骨架供团队使用,这样做的好处还有在新人加入团队的初期能够快速的理解项目。
0x02 创建自定义archetype工程
archetype是在maven-archetype-plugin插件执行generate目标的时候进行配置的,本次使用IDEA进行archetype的开发,创建archetype的目录结构如下:
下面对上述图片中的描述进行详细的解释:
根目录下boyuarchetype/pom.xml和一般的maven项目一样主要定义项目的坐标等信息。
所有的项目骨架内容都集中在boyuarchetype/src/main/resources/archetype-resources中,其中的pom.xml定义了待生成项目的pom文件的内容,/src/main/java、/src/test/java中分别定义了待生成项目中相应目录下的内容。
boyuarchetype/src/main/resources/META-INF/maven/archetype-metadata.xml中定义相关的元数据描述。
0x03 archetype工程文件详细介绍
1.boyuarchetype/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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.none.budmwp</groupId>
<artifactId>boyuarchetype</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>boyuarchetype</name>
<url>http://maven.apache.org</url>
</project>
pom.xml中的packaging和普通的maven项目打包方式相同为jar,没有和插件开发的打包方式保持一致。
groupId一般的命名规则为公司名加项目名称,如:com.segmentfault.budmwp
artifactId是指budmwp这个项目中的模块名称。
modelVersion在maven2和maven3中都是4.0.0
2.boyuarchetype/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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<name>${artifactId}</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
上面${}标识的变量都是通过maven中的命令行传进来的,如:mvn archetype:generate -DgroupId=com.none.budmwp
3.boyuarchetype/src/main/resources/META-INF/maven/archetype-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="sample">
<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>
</fileSets>
<requiredProperties>
<requiredProperty key="package-name"></requiredProperty>
</requiredProperties>
</archetype-descriptor>
filtered="true"标识下面提到的${}是否要进行替换
packaged="true"标识boyuarchetype/src/main/resources/archetype-resources/src/main/java中对应的内容是否要放入到package中。
4.boyuarchetype/src/main/resources/archetype-resources/src/main/java/App.java
package ${package};
/**
* @author boyu
* @version $Id: a, v0.1 16/5/2 下午2:28 boyu Exp $.
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
${package}会被maven命令行中传进来的参数进行替换。
0x04 构建archetype工程
通过上面将一个简单的archetype工程已经搭建完成,接下来要去根据这个archetype创建我们定义好的项目骨架。
首先进入到boyuarchetype工程文件下进行make clean install
这个项目,完成后会打包成boyuarchetype-1.0.jar并加入到本地仓库中,下面我们只需要根据本地仓库中的boyuarchetype-1.0.jar包去创建我们事先定义好的项目框架, mvn archetype:generate -DgroupId=com.none.budmwp -DartifactId=boyuarchetest -Dpackage="com.none.budmwp.boyuarchetest" -DarchetypeGroupId=com.none.budmwp -DarchetypeArtifactId=boyuarchetype -DarchetypeVersion=1.0 -X -DarchetypeCatalog=local
执行命令后会穿件如下的项目结构:
好了现在可以进入到boyuarchetypetest中去执行mvn test
运行测试用例。到这里整个项目就创建完毕了。
0x05 总结
初入java,进入到公司参与项目的第一件事就是拉代码学习代码,但是没有接触过过多的java开发不知道maven、eclipse所谓何物,只有依赖老手们领进门了。maven是一个很好的构建管理工具,目前java重度用户阿里、支付宝都是通过maven来进行项目构建的,所以还是有必要去了解了解maven的,未来还很遥远,让maven来提高你的项目构建效率吧。
0x06 参考资料
大家可以去参考许晓斌著的maven实战一书,里面讲maven讲的很好,初学者可以快速入门。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。