1.maven-clean-plugin是個什麼鬼?
maven-clean-plugin
這個插件用maven的人都不陌生.我們在執行指令
mvn clean
時調用的就是這個插件.
這個插件的主要作用就是清理建構目錄下得全部内容,建構目錄預設是target,但是有時候我們會配置
project.build.directory
,
project.build.outputDirectory
project.build.testOutputDirectory
project.reporting.outputDirectory
這四個目錄,調用這個插件時同時也會清理這幾個目錄下得檔案.
2.helloworld
一般不需要在pom.xml配置
maven-clean-plugin
.如果要手動配置,大體配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</build>
然後執行
mvn clean
或
mvn clean:clean
來調用這個插件清理項目.
qyfmac$ mvn clean
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building learn-maven 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ learn-maven ---
[INFO] Deleting /Users/qyfmac/git/learn-maven/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.437 s
[INFO] Finished at: 2015-12-22T17:25:23+08:00
[INFO] Final Memory: 5M/156M
[INFO] ------------------------------------------------------------------------
3.跳過執行
跳過執行有兩種方式,都很簡單,加個參數就行.
- 指令行中追加參數
.mvn clean -Dmaven.clean.skip=true
- pom.xml檔案中配置參數
org.apache.maven.plugins
maven-clean-plugin
3.0.0
true
```
跳過清理,我是還沒在項目中遇到需要這麼做的地方,可能有些項目的建構目錄隻允許手動清理的需要跳過清理吧.
4.忽略錯誤
當執行
mvn clean package
這樣的指令時,如果clean執行失敗,會導緻整個建構停止.為了讓clean執行出錯後還能繼續執行其他指令,就需要配置讓忽略錯誤.配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnError>false</failOnError>
</configuration>
</plugin>
5.清理建構目錄外的檔案
有些項目,建構時需要清理建構目錄以外的檔案,比如制定的日志檔案.這時候就需要配置
<filesets>
來實作了.配置方式如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!--<skip>true</skip>-->
<!--<failOnError>false</failOnError>-->
<!--當配置true時,隻清理filesets裡的檔案,建構目錄中得檔案不被清理.預設是flase.-->
<excludeDefaultDirectories>false</excludeDefaultDirectories>
<filesets>
<fileset>
<!--要清理的目錄位置-->
<directory>${basedir}/logs</directory>
<!--是否跟随符号連結 (symbolic links)-->
<followSymlinks>false</followSymlinks>
<!--預設有些檔案是不會被清理的,比如.svn檔案,如果設定成false,則全部按照自定義的來處理-->
<useDefaultExcludes>true</useDefaultExcludes>
<!--對這些檔案進行清理-->
<includes>
<include>**/*</include>
</includes>
<!--對這些檔案不清理-->
<excludes>
<exclude>nc*</exclude>
</excludes>
</fileset>
</filesets>
</configuration>
</plugin>
每個配置的作用在代碼裡加了注釋.不過我查遍所有能找到的資料,都沒搞懂
<followSymlinks>
這個标簽幹什麼用的.官方文檔是這麼說的:
followSymLinks:
Sets whether the plugin should follow symbolic links while deleting files from the default output directories of the project. Not following symlinks requires more IO operations and heap memory, regardless whether symlinks are actually present. So projects with a huge output directory that knowingly does not contain symlinks can improve performance by setting this parameter to true.
Starting with 3.0.0 the property has been renamed from clean.followSymLinks to maven.clean.followSymLinks.
Type: boolean
Since: 2.1
Required: No
User Property: maven.clean.followSymLinks
Default: false
這段話看的我雲裡霧裡,如果誰知道還望不吝賜教,給我部落格留言或發我郵箱告知.
6.clean的生命周期
clean什麼周期分三個階段.
名稱 | 說明 |
---|---|
pre-clean | executes processes needed prior to the actual project cleaning |
clean | remove all files generated by the previous build |
post-clean | executes processes needed to finalize the project cleaning |
maven-clean-plugin
這個插件綁定的就是
clean
階段.
7.進階
不管是
clean生命周期
還是
maven-clean-plugin
插件,都比較簡單,現在說個有趣的東西.我們經常執行指令
mvn clean package
打包項目,目的是為了防止部分之前的輸出目錄裡有髒資料導緻打出的包有問題.其實我們可以把清理指令綁定到打包的什麼周期裡,然後執行所有指令都會先進行清理,那樣我們的
mvn package
和
mvn clean package
就是等價的了.配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
以後執行的絕大多數指令都會先清理項目了.
initialize屬于maven的生命周期的哪個階段?
[validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy]
答案是第二個階段.
8.結語
這個插件就一個指令
clean:clean
,做的事情就是清理,然後就是可以配置清理目錄和清理政策.
示例代碼github位址: https://github.com/qyf404/learn-maven/tree/maven-clean-plugin
參考
- 官方文檔:http://maven.apache.org/plugins/maven-clean-plugin
- http://stackoverflow.com/questions/15350688/custom-maven-clean-with-fileset-not-working
- https://issues.apache.org/jira/browse/MCLEAN-29
- https://issues.apache.org/jira/browse/MCLEAN-39
關于作者
作者:辵鵵
出處:http://qyf404.cnblogs.com
歡迎轉載,但未經作者同意請保留此段聲明,并在文章頁面明顯位置給出原文連結。