maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信不少的java开发者应该都了解maven并可能在工做当中都是经过maven来管理项目的,在建立的项目的时候,咱们每每会使用maven内置的项目骨架也就是archetype来快速生成项目结构。可是在一个团队作开发的过程当中,可能仅仅依靠maven预先提供的archetyp多是不够的,团队之间协做有本身的定义方式,每一个人的结构定义风格也不尽相同,在这样的背景下咱们有必要去定义一个统一的代码骨架供团队使用,这样作的好处是当团队须要开始一个新项目的时候,能够利用自定义的maven骨架一键生成项目。java
archetype是在maven-archetype-plugin插件执行generate目标的时候进行配置的,咱们常用到maven的内嵌的骨架包括:maven-archetype-webapp、maven-archetype-quickstart。前者用来快速搭建一个web工程项目,后者用来快速搭建一个普通的java工程项目。git
单模块项目的archetype脚手架项目的结构github
上图中的各个文件详解:web
1.beast-archetype/pom.xml内容以下apache
<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.thebeastshop</groupId> <artifactId>beast-archetype</artifactId> <version>1.1</version> <packaging>jar</packaging> <name>beast-archetype</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>beast-archetype</finalName> </build> </project>
2.src/main/resources/archetype-resources/pom.xml内容以下:api
<?xml version="1.0"?> <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> <name>${artifactId}</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-archetype-plugin</artifactId> <version>2.2</version> <configuration> <source>1.7</source> <target>1.7</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.thebeastshopmybatis
3.src/main/resources/META-INF/maven/archetype-metadata.xml内容以下:app
<?xml version="1.0" encoding="UTF-8"?> <archetype-descriptor name="beast-archetype" xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"> <requiredProperties> <requiredProperty key="package-name" /> </requiredProperties> <fileSets> <fileSet filtered="true" packaged="true" encoding="UTF-8"> <directory>src/main/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" packaged="true" encoding="UTF-8"> <directory>src/test/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </archetype-descriptor>
说明:webapp
4.src/main/resources/archetype-resources/src/main/java/Demo.java内容以下:maven
package ${package}; public class Demo{ public static void main( String[] args ) { System.out.println( "Hello My Archetype!" ); } }
5.这样咱们就手写好了一个自定义的maven的archetype骨架项目,咱们只须要经过mvn clean install 命令把该jar包安装到本地仓库,而后经过本地仓库中的该jar包来生成一个项目看看效果,使用以下命令:
mvn archetype:generate
-DgroupId=comthebeastshop
-DartifactId=beast-test
-Dpackage="com.thebeastshop.test"
-DarchetypeGroupId=com.thebeastshop
-DarchetypeArtifactId=beast-archetype -DarchetypeVersion=1.1 -X -DarchetypeCatalog=local
3、手写maven多module的项目骨架archetype
1.多模块骨架项目的项目结构
这跟单模块项目区别不大,可是有几个概念须要说明:
2.模板工程定义描述文件:META-INF/maven/archetype-metadata.xml
<?xml version="1.0" encoding="UTF-8"?> <archetype-descriptor name="beast-archetype" xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"> <requiredProperties> <requiredProperty key="groupId"> <defaultValue>com.thebeastshop</defaultValue> </requiredProperty> <requiredProperty key="artifactId"> <defaultValue>test</defaultValue> </requiredProperty> <requiredProperty key="package"> <defaultValue>com.thebeastshop.test</defaultValue> </requiredProperty> </requiredProperties> <modules> <module id="${rootArtifactId}-api" name="${rootArtifactId}-api" dir="__rootArtifactId__-api"> <fileSets> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </module> <module id="${rootArtifactId}-core" name="${rootArtifactId}-core" dir="__rootArtifactId__-core"> <fileSets> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </module> <module id="${rootArtifactId}-dao" name="${rootArtifactId}-dao" dir="__rootArtifactId__-dao"> <fileSets> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> <include>mapper</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </module> <module id="${rootArtifactId}-main" name="${rootArtifactId}-main" dir="__rootArtifactId__-main"> <fileSets> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/main/assembly</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/main/bin</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </module> <module id="${rootArtifactId}-mybatisGen" name="${rootArtifactId}-mybatisGen" dir="__rootArtifactId__-mybatisGen"> <fileSets> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> <fileSet encoding="UTF-8"> <directory>src/test/resources</directory> <includes> <include>**/*.*</include> </includes> </fileSet> </fileSets> </module> </modules> </archetype-descriptor>
<requiredProperties> <requiredProperty key="groupId"> <defaultValue>com.thebeastshop</defaultValue> </requiredProperty> <requiredProperty key="artifactId"> <defaultValue>test</defaultValue> </requiredProperty> <requiredProperty key="package"> <defaultValue>com.thebeastshop.test</defaultValue> </requiredProperty> </requiredProperties>
这些属性能够在资源元文件里的任意一个文件里经过${var}来引用,因此的元文件最终均可以选择经过velocity引擎来执行替换后生成。
默认的属性有:groupId,artifactId,packeage,version等
<modules> <module id="${rootArtifactId}-api" name="${rootArtifactId}-api" dir="__rootArtifactId__-api"> ... </module> <module id="${rootArtifactId}-core" name="${rootArtifactId}-core" dir="__rootArtifactId__-core"> ... </module> <module id="${rootArtifactId}-dao" name="${rootArtifactId}-dao" dir="__rootArtifactId__-dao"> ... </module> <module id="${rootArtifactId}-main" name="${rootArtifactId}-main" dir="__rootArtifactId__-main"> ... </module> <module id="${rootArtifactId}-mybatisGen" name="${rootArtifactId}-mybatisGen" dir="__rootArtifactId__-mybatisGen"> ... </module> </modules>
module有三个属性,解释以下:
id :定义子模块工程的artifactId.
dir :子模块工程源文件在archetype-resources里对应的directory.
name :子模块的名字.
3.子模块pom.xml定义以下(以core模块为例):
<?xml version="1.0"?> <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> <parent> <groupId>com.thebeastshop</groupId> <artifactId>${rootArtifactId}</artifactId> <version>${version}</version> </parent> <artifactId>${artifactId}</artifactId> <name>${artifactId}</name> <dependencies> <dependency> <groupId>com.thebeastshop</groupId> <artifactId>${rootArtifactId}-api</artifactId> <version>${api.version}</version> </dependency> <dependency> <groupId>com.thebeastshop</groupId> <artifactId>${rootArtifactId}-dao</artifactId> <version>${project.parent.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
其中${rootArtifactId}就表明父项目的artifactId.
4.咱们和单模块脚手架工程同样,经过mvn clean install命令把该脚手架项目安装到本地maven仓库,而后就可使用该项目来快速生成新项目结构了,生成命令以下:
mvn archetype:generate
-DgroupId=com.thebeastshop
-DartifactId=ddd
-Dversion=1.0.0-SNAPSHOT
-DarchetypeGroupId=com.thebeastshop
-DarchetypeArtifactId=beast-archetype
-DarchetypeVersion=1.3-SNAPSHOT -X -DarchetypeCatalog=local
咱们就会看到生成好的项目结构以下:
多模块项目脚手架源码:https://github.com/hafizzhang/beast-archetype
4、总结
在工做中,咱们一般要有“偷懒”意识,经过摸索来开发出相似项目脚手架同样的工具来提高本身工做的效率。不能成天都是浑浑噩噩的过去,并且表面上看上去很难的东西实际上并不见得必定就如想象中的难。程序猿仍是要有所追求,哈哈~