一、創(chuàng)建自己的archetype一般有兩種方式,比較簡單的就是create from project
1.1、首先使用eclipse創(chuàng)建一個新的maven project,然后把配置好的一些公用的東西放到相應(yīng)的目錄下面
比如說會將一些常用的java代碼存放到src/main/java目錄下面;
會將一些通用的配置文件放到src/main/resources目錄下面;
如果是javeEE工程,還會有一些jsp等等的文件存放到src/main/webapp目錄下面
1.2、然后在maven project的pom.xml文件中添加插件
================================================
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
================================================
1.3、打開cmd窗口,cd到剛才創(chuàng)建的maven project的根目錄,運行maven命令:
mvn archetype:create-from-project
然后會在target目錄下面生成generated-sources目錄,這個就是生成的 archetype
1.4、cd進入generated-sourced/archetype目錄,運行maven命令:
mvn install
這樣就把自定義的archetype安裝到本地倉庫了。
archetype安裝的地址是在maven安裝目錄下面的conf/settings.xml文件中指定的(<localRepository>字節(jié))。
默認會在 ~/.m2 目錄下面生成一個archetype-catalog.xml文件(和默認的settings.xml在同一個目錄),
聲明了該archetype的groupId、artifactId和其他屬性。
因為Eclipse創(chuàng)建maven項目過程中,選擇的“Default Local”指向的地址就是 ~/.m2,
所以文件archetype-catalog.xml會被eclipse自動讀取,
使用eclipse創(chuàng)建maven項目的時候可以在"Default Local"一項中找到剛才自定義archetype名字。
1.5、如果想要卸載剛才安裝的archetype,只需要將~/.m2目錄下面的archetype-catalog.xml文件中對應(yīng)的<archetype>字節(jié)段刪掉,
并且把本地倉庫中相應(yīng)groupId和artifactId下面的文件刪掉就可以了。
1.6、安裝到本地倉庫中的archetype只可以被自己使用,如果想要共享,那么在第四步的時候使用deploy命令,不要使用install命令。
直接使用archetype:create-from-project比起手工去打造一個archetype要便捷的多,但, 有時候偷懶會有些不靠譜,archetype:create-from-project的某些行為可能會與我們最初的設(shè)想有出入,這個時候就需要我們在最終發(fā)布新創(chuàng)建的archetype之前,做有些后繼處理,比如:
對于要包含到archetype的Java代碼文件來說, archetype:create-from-project之后, Java代碼文件原來的package結(jié)構(gòu)會被忽略掉,比如,對于如下類來說:
cn.spring21.app.defaults.controller.QuickStartController
當(dāng)archetype:create-from-project之后, archetype中對應(yīng)的文件就變成了:
QuickStartController
這顯然不是我們想要的結(jié)果(當(dāng)然,對于不在乎這一結(jié)構(gòu)的archetype來說則無所謂),為此,我們要對archetype:create-from-project之后生成的結(jié)果文件進行定制。
首先, 我們編輯文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml,它記載了archetype里都包含哪些文件和目錄結(jié)構(gòu),將如下內(nèi)容:
Xml代碼
1. <sources>
2. <source>src/main/java/QuickStartController.java</source>
3. </sources>
變更為:
Xml代碼
1. <sources>
2. <source>src/main/java/cn/spring21/app/defaults/controller/QuickStartController.java</source>
3. </sources>
然后,將以上文件和目錄結(jié)構(gòu)創(chuàng)建或者Copy到如下目錄:
target/generated-sources/archetype/src/main/resources/archetype-resources/src/main/java
所有這些做完之后,Java源代碼文件結(jié)構(gòu)就可以保持了。
雖然想要的Java源代碼目錄結(jié)構(gòu)可以保持住了,不過, 還會有一個煩人的地方,如果我們在使用這個archetype創(chuàng)建新的project的時候,不明確指定packageName,那maven會“自作多情”的把groupId作為Java文件的package,前綴到原來的package前面。比如, 如果我原來java文件對應(yīng):
cn/spring21/app/defaults/controller/QuickStartController.java
而創(chuàng)建項目的時候, 指定“-DgroupId=cn.spring21”,那么,最后生成的項目中, 對應(yīng)的Java文件就跑到了“cn/spring21/cn/spring21/app/defaults/controller/QuickStartController.java”,stupid哈
要解決這個問題, 可以在使用archetype創(chuàng)建project的時候,明確將packageName指定為空:
mvn archetype:create -DarchetypeGroupId=archetypeGroupId-DarchetypeArtifactId=archetypeArtifactId-DarchetypeVersion=0.0.2-SNAPSHOT -DgroupId=cn.spring21-DartifactId=sample -Dversion=0.0.1-SNAPSHOT -DpackageName=
唯一不爽的就是命令行實在實在太長了。
有時候, archetype:create-from-project會把一些不必要的文件和目錄結(jié)構(gòu)也包含到最終的archetype中, 我們可以通過編輯文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml來清理這些不必要包含的文件和目錄結(jié)構(gòu)。
比方說,如果我們是使用EclipseIDE來搭建要做成archetype的project的話,一些EcilpseIDE特有的文件和目錄,比如.settings目錄啦,.classpath/.project文件啦,都會被copy到archetype的目錄下,這時候,我們就可以把archetype-metadata.xml文件中對應(yīng)這些文件和目錄的<fileset>元素刪除掉來清理它們。
如果某些二進制文件要包含到archetype當(dāng)中, 比如, 常見的圖片文件, 我們需要編輯archetype.xml文件中對應(yīng)這些文件的<resource>元素配置,為這些元素添加filtered="false"的屬性, 否則的話,當(dāng)使用這個archetype來創(chuàng)建新的工程的時候,這些二進制文件就會“廢廢”了,原因嘛,還是因為maven太“自作多情”,呵呵,居然把圖片當(dāng)Velocity模板來看待。