Part 1:緣由在於咱們參數的差別:maven
狀況1 :mvn clean install -Dmaven.test.skip=trueide
這種狀況,即不編譯測試類文件,也不執行測試類文件單元測試
狀況2:mvn clean install –Dmaven.test.skip.exec=true測試
這種狀況,編譯測試類文件成字節碼文件,可是不執行字節碼文件ui
因爲之前你們都沒寫單元測試,因此沒問題,如今有單元測試進來了,因而問題來了。spa
----分界線----orm
第一種狀況下,(也就是出錯的狀況),咱們maven3(基於JDK 1.6) 不編譯這些,因此一直運行到build successful ,沒問題。blog
而後。。(關鍵來了)執行sonar,由於咱們Jenkins版本很是低,只能接受sonar2.0,而sonar 2.0(基於JDK 1.5)在執行生命週期時 maven-compiler-plugin:2.3.2:testCompile時候,他發現沒有編譯那些類,因此他用jdk 1.5編譯測試類,而咱們源代碼是1.6的源碼,他沒能力編譯這些,因此編譯不經過。生命週期
第二種狀況, 咱們maven3(基於JDK 1.6) 編譯這些類,因此在target目錄下生成了 1.6版本的字節碼,可是不運行他們。一切都很順利,而後到了sonar了,一樣會調用compiler-plugin:2.3.2:testCompile ,(關鍵來了),此時他比較一下時間戳,發現是已經有最新的字節碼了(剛maven3 使用JDK 1.6來編譯的),因此,他就跳過了testCompile階段,因此沒問題了。ip
Part 2:解決辦法
一個辦法就是把參數弄成Dmaven.test.skip.exec ,但這不是最好的方法
最好的方法是,讓sonar的source version 和target version都設置爲1.6,而不是默認的1.5