問題提出
pom.xml中的<packaging>是該項目的打包方式,Maven預設的幾種打包方式分別是:
jar/war/ejb/ejb3/rar;打包方式會與Lifecycle做一個綁定,mvn會根據打包的類型來調用不同的插件來完成打包的工作。
比如jar包就會調用maven-jar-plugin的jar任務來打包,war會調用war:war來完成打包
幾種默認的Lifecycle綁定(ejb/jar/rar/war):
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResource |
test-compile | compiler:testCompiler |
package | ejb:ejb jar:jar rar:rar war:war |
install | install:install |
deploy |
deploy:deploy |
但是,我需要自己定義一種打包方式,car包,這種方式是war包的一箇中間階段,這種包除了不包含WEB-INF/lib和web.xml外和war包格式一樣的。
幾個不同的car可以合併成爲同一個war包,這樣就可以解決在一個ear包中,導致同一個jar在不同的war中反覆被引用的情況。
Maven中自定義Package 類型並綁定Lifecyle的過程是:
- 創建一個Maven 插件工程,package 類型爲maven-plugin
- 請參照《Maven Definitive》的關於自定義插件的章節,定義自定義插件的Mojo Goal。
- 在src/main/resources 的目錄下,創建文件夾 META-INF/plexus,並在該文件夾下加入文件 components.xml。
- components.xml向Maven的內在容器Plexus Container描述了插件的基本信息。這裏有一個Sample,來自maven-magma-plugin的components.xml.
- 在這個文件中,將magma替換爲你自定義的打包類型。
- 將你自己寫的插件deploy到Repository中,如果要引用自定義打包類型。pom.xml文件需要注意的地方是:
packaging應該自定義的打包類型的名字。
而在plugin的配置的時候,要將extensions設置爲true,比如:
<plugin> <groupId>org.apache.magma.tools</groupId> <artifactId>maven-magma-plugin</artifactId> <extensions>true</extensions> </plugin>
感謝[email protected]的熱情幫助解決我的問題,請大家有關於Maven問題在users@maven.apache.org中提出,這裏有很多的熱心人。