讀古今文學網 > Maven實戰 > 17.5 錯誤處理和日誌 >

17.5 錯誤處理和日誌

如果大家看一下Maven的源碼,會發現AbstractMojo實現了Mojo接口,execute()方法正是在這個接口中定義的。具體代碼如下:

這個方法可以拋出兩種異常,分別是MojoExecutionException和MojoFailureException。

如果Maven執行插件目標的時候遇到MojoFailureException,就會顯示「BUILD FAILURE」的錯誤信息,這種異常表示Mojo在運行時發現了預期的錯誤。例如maven-surefire-plugin運行後若發現有失敗的測試就會拋出該異常。

如果Maven執行插件目標的時候遇到MojoExecutationException,就會顯示「BUILD ERROR」的錯誤信息。這種異常表示Mojo在運行時發現了未預期的錯誤,例如代碼清單17-2中我們不知道代碼行統計插件何時會遇到IOException,這個時候只能將其嵌套進MojoExecutationException後再拋出。

上述兩種異常能夠在Mojo執行出錯的時候提供一定的信息,但這往往是不夠的,用戶在編寫插件的時候還應該提供足夠的日誌信息,AbstractMojo提供了一個getLog()方法,用戶可以使用該方法獲得一個Log對象。該對像支持四種級別的日誌方法,它們從低到高分別為:

·debug:調試級別的日誌。Maven默認不會輸出該級別的日誌,不過用戶可以在執行mvn命令的時候使用-X參數開啟調試日誌,該級別的日誌是用來幫助程序員瞭解插件具體運行狀態的,因此應該盡量詳細。需要注意的是,不要指望你的用戶會主動去看該級別的日誌。

·info:消息級別的日誌。Maven默認會輸出該級別的日誌,該級別的日誌應該足夠簡潔,幫助用戶瞭解插件重要的運行狀態。例如,maven-compiler-plugin會使用該級別的日誌告訴用戶源代碼編譯的目標目錄。

·warn:警告級別的日誌。當插件運行的時候遇到了一些問題或錯誤,不過這類問題不會導致運行失敗的時候,就應該使用該級別的日誌警告用戶盡快修復。

·error:錯誤級別的日誌。當插件運行的時候遇到了一些問題或錯誤,並且這類問題導致Mojo無法繼續運行,就應該使用該級別的日誌提供詳細的錯誤信息。

上述每個級別的日誌都提供了三個方法。以debug為例,它們分別為:

·void debug(CharSequence content);

·void debug(CharSequence content,Throwable error);

·void debug(Throwable error);

用戶在編寫插件的時候,應該根據實際情況選擇適應的方法。基本的原則是,如果有異常出現,就應該盡量使用適宜的日誌方法將異常堆棧記錄下來,方便將來的問題分析。

如果使用過Log4j之類的日誌框架,就應該不會對Maven日誌支持感到陌生,日誌不是一個Maven插件的核心代碼,但是為了方便使用和調試,完整的插件應該具備足夠豐富的日誌代碼。