Maven(6)--archetype
Archetype是Maven工程的模板工具包。一個(gè)Archetype定義了要做的相同類型事情的初始樣式或模型。這個(gè)名稱給我們提供來(lái)了一個(gè)一致的生成Maven工程的方式。Archetype會(huì)幫助作者給用戶創(chuàng)建Maven工程模板,并給用戶提供生成相關(guān)工程模板版本的參數(shù)化方法。
使用Archetype提供的好的方法,是開(kāi)發(fā)者能夠使用最佳實(shí)踐來(lái)快速的構(gòu)建和組織一致化的工程。在Maven工程中,我們努力使用Archetype來(lái)盡可能快的給用戶提供示例工程,同時(shí)也會(huì)把Maven的最佳實(shí)踐介紹給新的用戶。一個(gè)新的用戶可以使用工作中的Maven工作作為跳板來(lái)研究更過(guò)的Maven中功能。我們也可以使用Archetype的添加機(jī)制,這樣就意味著允許我們抓取Archetype中項(xiàng)目片段,并把它們添加到既存的工程中。Maven網(wǎng)站的Archetype就是很好的例子。例如,你可以使用“quick start archetype”來(lái)生成一個(gè)工程,然后就可以通過(guò)其中既存的“site archetype”來(lái)快速的創(chuàng)建一個(gè)網(wǎng)址工程。你能夠使用Archetype來(lái)做很多這樣的事情。
使用archetype一般步驟
mvn archetype:generate
批量方式使用archetype
mvn archetype:generate -B ...
常用archetype介紹
maven-archetype-quickstart
默認(rèn)的Archetype,基本內(nèi)容包括:
一個(gè)包含junit依賴聲明的pom.xml
src/main/java主代碼目錄及一個(gè)名為App的類
src/test/java測(cè)試代碼目錄及一個(gè)名為AppTest的測(cè)試用例
maven-archetype-webapp
一個(gè)最簡(jiǎn)單的Maven war項(xiàng)目模板,當(dāng)需要快速創(chuàng)建一個(gè)Web應(yīng)用的時(shí)候可以使用它。生成的項(xiàng)目?jī)?nèi)容包括:
一個(gè)packaging為war且?guī)в衘unit依賴聲明的pom.xml
src/main/webapp/目錄
src/main/webapp/index.jsp文件
src/main/webapp/WEB-INF/web.xml文件
maven提供的41個(gè)archetype:
1: appfuse-basic-jsf (創(chuàng)建一個(gè)基于Hibernate,Spring和JSF的Web應(yīng)用程序的原型)
2: appfuse-basic-spring(創(chuàng)建一個(gè)基于Hibernate,Spring和Spring MVC的Web應(yīng)用程序的原型)
3: appfuse-basic-struts(創(chuàng)建一個(gè)基于Hibernate,Spring和Struts 2的Web應(yīng)用程序的原型)
4: appfuse-basic-tapestry(創(chuàng)建一個(gè)基于Hibernate,Spring 和 Tapestry 4的Web應(yīng)用程序的原型)
5: appfuse-core(創(chuàng)建一個(gè)基于Hibernate,Spring 和 XFire的jar應(yīng)用程序的原型)
6: appfuse-modular-jsf(創(chuàng)建一個(gè)基于Hibernate,Spring和JSF的模塊化應(yīng)用原型)
7: appfuse-modular-spring(創(chuàng)建一個(gè)基于Hibernate, Spring 和 Spring MVC 的模塊化應(yīng)用原型)
8: appfuse-modular-struts(創(chuàng)建一個(gè)基于Hibernate, Spring 和 Struts 2 的模塊化應(yīng)用原型)
9: appfuse-modular-tapestry (創(chuàng)建一個(gè)基于 Hibernate, Spring 和 Tapestry 4 的模塊化應(yīng)用原型)
10: maven-archetype-j2ee-simple(一個(gè)簡(jiǎn)單的J2EE的Java應(yīng)用程序)
11: maven-archetype-marmalade-mojo(一個(gè)Maven的 插件開(kāi)發(fā)項(xiàng)目 using marmalade)
12: maven-archetype-mojo(一個(gè)Maven的Java插件開(kāi)發(fā)項(xiàng)目)
13: maven-archetype-portlet(一個(gè)簡(jiǎn)單的portlet應(yīng)用程序)
14: maven-archetype-profiles()
15: maven-archetype-quickstart()
16: maven-archetype-site-simple(簡(jiǎn)單的網(wǎng)站生成項(xiàng)目)
17: maven-archetype-site(更復(fù)雜的網(wǎng)站項(xiàng)目)
18: maven-archetype-webapp(一個(gè)簡(jiǎn)單的Java Web應(yīng)用程序)
19: jini-service-archetype(Archetype for Jini service project creation)
20: softeu-archetype-seam(JSF+Facelets+Seam Archetype)
21: softeu-archetype-seam-simple(JSF+Facelets+Seam (無(wú)殘留) 原型)
22: softeu-archetype-jsf(JSF+Facelets 原型)
23: jpa-maven-archetype(JPA 應(yīng)用程序)
24: spring-osgi-bundle-archetype(Spring-OSGi 原型)
25: confluence-plugin-archetype(Atlassian 聚合插件原型)
26: jira-plugin-archetype(Atlassian JIRA 插件原型)
27: maven-archetype-har(Hibernate 存檔)
28: maven-archetype-sar(JBoss 服務(wù)存檔)
29: wicket-archetype-quickstart(一個(gè)簡(jiǎn)單的Apache Wicket的項(xiàng)目)
30: scala-archetype-simple(一個(gè)簡(jiǎn)單的scala的項(xiàng)目)
31: lift-archetype-blank(一個(gè) blank/empty liftweb 項(xiàng)目)
32: lift-archetype-basic(基本(liftweb)項(xiàng)目)
33: cocoon-22-archetype-block-plain([http://cocoapacorg2/maven-plugins/])
34: cocoon-22-archetype-block([http://cocoapacorg2/maven-plugins/])
35:cocoon-22-archetype-webapp([http://cocoapacorg2/maven-plugins/])
36: myfaces-archetype-helloworld(使用MyFaces的一個(gè)簡(jiǎn)單的原型)
37: myfaces-archetype-helloworld-facelets(一個(gè)使用MyFaces和Facelets的簡(jiǎn)單原型)
38: myfaces-archetype-trinidad(一個(gè)使用MyFaces和Trinidad的簡(jiǎn)單原型)
39: myfaces-archetype-jsfcomponents(一種使用MyFaces創(chuàng)建定制JSF組件的簡(jiǎn)單的原型)
40: gmaven-archetype-basic(Groovy的基本原型)
41: gmaven-archetype-mojo(Groovy mojo 原型)
編寫archetype
單模塊項(xiàng)目的archetype項(xiàng)目的結(jié)構(gòu)
上圖中的各個(gè)文件詳解:
- 根目錄beast-archetype下的pom.xml和一般的maven項(xiàng)目一樣主要定義archetype項(xiàng)目的坐標(biāo)等信息。
- 所有的項(xiàng)目骨架內(nèi)容都集中在src/main/resources/archetype-resources文件夾下。
- archetype-resources中的pom.xml定義了待生成項(xiàng)目的pom文件的內(nèi)容,/src/main/java、/src/test/java中分別定義了待生成項(xiàng)目中相應(yīng)目錄下的內(nèi)容
- /src/main/resources/META-INF/maven/archetype-metadata.xml中定義相關(guān)的元數(shù)據(jù)描述(其中該文件的位置固定為resources/META-INF/maven文件夾下,且名稱固定為archetype-metadata.xml)。
beast-archetype/pom.xml內(nèi)容如下
<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>src/main/resources/archetype-resources/pom.xml內(nèi)容如下:
<?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.0http://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>其中:上面${}標(biāo)識(shí)的變量都是通過(guò)maven中的命令行傳進(jìn)來(lái)的,如:mvn archetype:generate -DgroupId=com.thebeastshop
src/main/resources/META-INF/maven/archetype-metadata.xml內(nèi)容如下:
<?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.0http://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>說(shuō)明:
- packaged="true"標(biāo)識(shí)src/main/resources/archetype-resources/src/main/java中對(duì)應(yīng)的內(nèi)容是否要放入到package中,比如package為com.thebeastshop,那么如果該屬性為true,則對(duì)應(yīng)的java文件會(huì)放到com/thebeastshop文件夾下,也就是包路徑下。
- filtered="true"標(biāo)識(shí)下面提到的${}是否要進(jìn)行替換
src/main/resources/archetype-resources/src/main/java/Demo.java內(nèi)容如下:
package ${package};public class Demo{public static void main( String[] args ){System.out.println( "Hello My Archetype!" );} }maven多module的項(xiàng)目骨架archetype
多模塊骨架項(xiàng)目的項(xiàng)目結(jié)構(gòu)
這跟單模塊項(xiàng)目區(qū)別不大,但是有幾個(gè)概念需要說(shuō)明:
- “__rootArtifactId__”占位符會(huì)被parent項(xiàng)目的artifactId替換
- ${rootArtifactId}也會(huì)被parent項(xiàng)目的artifactId替換
- src/main/resources/archetype-resources里必須要有一個(gè)頂級(jí)pom文件(如果是單工程就是工程pom文件),同時(shí)子文件夾代表了模塊定義
模板工程定義描述文件: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.0http://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>這些屬性可以在資源元文件里的任意一個(gè)文件里通過(guò)${var}來(lái)引用,所以的元文件最終都可以選擇通過(guò)velocity引擎來(lái)執(zhí)行替換后生成。
默認(rèn)的屬性有:groupId,artifactId,packeage,version等
項(xiàng)目子模塊定義
<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有三個(gè)屬性,解釋如下:
- id :定義子模塊工程的artifactId.
- dir:子模塊工程源文件在archetype-resources里對(duì)應(yīng)的directory.
- name :子模塊的名字.
子模塊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.0http://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}就代表父項(xiàng)目的artifactId.
通過(guò)mvn clean install命令把該項(xiàng)目安裝到本地maven倉(cāng)庫(kù),然后就可以使用該項(xiàng)目來(lái)快速生成新項(xiàng)目結(jié)構(gòu)了,生成命令如下:
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我們就會(huì)看到生成好的項(xiàng)目結(jié)構(gòu)如下:
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Maven(6)--archetype的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Maven(5)--常用插件
- 下一篇: Maven版本管理