1. 程式人生 > >讓Maven正確處理javac警告

讓Maven正確處理javac警告

如果你用maven編譯專案,而且在專案中用了SUN的專用API,你會得到警告資訊,然後Maven會報告編譯失敗,像這個樣子:


[ERROR] \workspaces\mvn\javac-warning-test\src\main\java\com\juvenxu\TestJavacWarning.java:[7,32] 警告:sun.misc.BASE64Decoder 是 Sun 的專用
API,可能會在未來版本中刪除
[INFO] ————————————————————-
[INFO] BUILD FAILURE

這當然是不合理的,javac只是警告而已,maven憑什麼就直接報失敗呢?

其實最好的解決辦法是避免用到這些SUN專用的API,這些API都有現成的替代品,不過本文要討論的不是這個,如果你用了某個依賴,該依賴用了SUN專用API,你往往會束手無策。

第一反應是Maven肯定可以提供一些配置點,允許我們忽略這種警告,嗯,當初我也是這麼想的,一次培訓的時候,一同學問到這個問題,我想當然的回答,“這個配置javac忽略警告就可以啦,不是Maven的問題”,我自己根本沒有試過,這麼不負責任的回答我現在想想都臉紅。後來和 linux_china 又討論到這個問題,然後我動手嘗試了下,折騰了幾乎所有maven-compiler-plugin的配置,到最後竟然是無解!(其實也不算完全無解,至少我們可以配置maven-compiler-plugin忽略編譯錯誤,不過這個解決辦法連我自己都覺得太噁心)

無解歸無解,至少我找到了這個問題的根本原因,其實不是我找到的,是Hudson之父Kohsuke Kawaguchi發現的。事情是這樣的,Maven的commiter基本都是歐美的,人家的系統基本是英文的,那麼他們使用Sun專用API的時候,遇到的警告資訊是英語,以”WARNING“開頭的,我們知道,Maven是用maven-compiler-plugin執行編譯工作的,而預設情況maven-compiler-plugin是通過呼叫javac完成編譯的,那麼當javac給出”WARNING”的時候,他們根據這個關鍵字做個if判斷就把事情搞定了。

可是,他們忘了這個世界還有日本中國等國家啦,雖然Kohsuke Kawaguchi基本在美國混,但在日本肯定有不少朋友的,可能他朋友用日文系統遇到這問題了(當然,他自己也可能有日文系統),更不用提廣大的中國IT群眾了。之前,如果你在Google搜尋“javac maven 警告”,那是大量的資訊,可沒一篇有真正的解決方法。直到最近我在

阿里的技術部落格看到一篇文章講到了這個問題,並給出了一個patch,方法是強制設定javac使用英文的Locale,其實呢,這麼做有點暴力,如果使用者比較在意本地化的資訊怎麼辦呢?

Kohsuke Kawaguchi的建議顯然更合理啦,他說別用javac的輸出來判斷警告,而是用javac命令列的返回值來判斷,這樣就能避免這個問題。

方案雖好,但他沒有實現,這點可以理解,人家是大牛,而且估計系統都是英文的,沒空管這小事。

我基本也在英文系統上跑,實際中也沒遇到這問題,也沒太大激情去修這個bug,但偶爾的機會和同事Benjamin Bentmann抱怨了幾句,無非就是說這個問題困擾大量中國使用者啥的,他是Maven 3最主要的commiter,相當給面子啊,沒過一週,就修好了,然後讓我測試下。

嗯,義不容辭,我就建了個空專案,用了個sun.misc.BASE64Decoder,先簡單跑一遍,不出所料報錯了。接著我再加入如下的配置:

  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-compiler-plugin</artifactId>  
  4.     <version>2.3.1</version>  
  5.     <dependencies>  
  6.         <dependency>  
  7.             <groupId>org.codehaus.plexus</groupId>  
  8.             <artifactId>plexus-compiler-javac</artifactId>  
  9.             <version>1.8.1</version>  
  10.         </dependency>  
  11.     </dependencies>  
  12. </plugin>  

這個問題是在plexus-compiler-javac 1.8.1中修復的,因此強制讓maven-compiler-plugin依賴這個版本就可以了,照理說maven-compiler-plugin應該升級一下版本,那樣就只要配置外掛版本,而不是外掛依賴,可是目前新版本的maven-compiler-plugin還沒有釋出,只能湊活使用上面的配置啦。

再用maven編譯,會看到這樣的輸出:

[INFO] Compiling 1 source file to D:\workspaces\ws-maven-book\javac-warning-test\target\classes
[WARNING] \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\juvenxu\TestJavacWarning.java:[3,15] 警告:sun.misc.BASE64Decoder 是 Sun 的專
用 API,可能會在未來版本中刪除
[WARNING] \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\juvenxu\TestJavacWarning.java:[7,4] 警告:sun.misc.BASE64Decoder 是 Sun 的專
用 API,可能會在未來版本中刪除
[WARNING] \workspaces\ws-maven-book\javac-warning-test\src\main\java\com\juvenxu\TestJavacWarning.java:[7,32] 警告:sun.misc.BASE64Decoder 是 Sun 的專
用 API,可能會在未來版本中刪除
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————

警告仍然打印出來了,但Build成功了,問題解決啦!

最後的感觸是,國內搞開源還需要加勒個油啊!其實這不是什麼大的bug,但由於社群中缺少國內的積極分子,才導致這bug一拖再拖沒人理,大家一問再問,沒人解決。

大家一起加勒個油!

————————– 2010-09-10,教師節,更新 ——————————————————-

maven-compiler-plugin 2.3.2 釋出了,因此只需要配置使用該版本就ok了

  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-compiler-plugin</artifactId>  
  4.     <version>2.3.2</version>  
  5. </plugin>  

在這篇文章結尾處,給出了一種解決方法-->設定maven-compiler-plugin的版本為2.3.2.跑到我們的專案的pom.xml檔案中看了下,這邊的version設定的是2.0.2,改成2.3.2,順便換了個新版本的maven,maven倉庫沒去管,然後再編譯,問題解決了.

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-compiler-plugin</artifactId>  
    <version>2.3.2</version> <!--解決出現警告時build失敗問題--> 
    <configuration>
    <source>1.6</source>
    <target>1.6</target>
    <encoding>UTF-8</encoding> <!--解決GBK對映報錯問題-->
    </configuration>
</plugin>  

相關推薦

Maven正確處理javac警告

如果你用maven編譯專案,而且在專案中用了SUN的專用API,你會得到警告資訊,然後Maven會報告編譯失敗,像這個樣子: … [ERROR] \workspaces\mvn\javac-warning-test\src\main\java\com\juvenxu\

maven配置檔案中警告This expression evaluates to 4.2.4.RELEASE The property is defined in cn.的處理方法

在pom.xml中出現警告如下: This expression evaluates to 4.2.4.RELEASE The property is defined in cn.itcast:web_parent:0.0.1-SNAPSHOT 這句話:This expressi

使用python處理中文csv檔案,並excel正確顯示中文(避免亂碼)

使用python2處理中文時,經常會出現亂碼問題,之前使用python處理中文csv檔案時,處理過程程式輸出出現了亂碼,最後在程式中能夠正常顯示出中文,但是匯出檔案時,使用excel打開出現了中文亂碼問

正確處理下載文件時HTTP頭的編碼問題(Content-Disposition)

robot shel 回歸 發布 合並 市場 ots 例子 int 轉自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做項目時遇到了一個 case

bootstrap模態框遠程加載網頁的正確處理方式

clas 處理 加載網頁 logs def lose 刷新 客戶端 粘貼 bootstrap模態框遠程加載網頁的方法 在bootsrap模態框文檔裏給出了這個方法: 使用鏈接模式 <a data-toggle="modal" href="tieniu.php

maven正確的集成命令-U -B 等

磁盤 strong cal 分析 一行 打印 health -i 所有 http://healthandbeauty.iteye.com/blog/1618501 在持續集成服務器上使用怎樣的 mvn 命令集成項目,這個問題乍一看答案很顯然,不就是 mvn clea

embed標簽 阻止點擊事件 父元素處理點擊事件

rev 計算 pointer rgb target 特性 inter 版本 css樣式 由於規定頁面顯示的PDF文件要有固定大小,使得頁面風格統一 最開始發現了CSS樣式pointer-events 寫出如下代碼,在360急速瀏覽器急速模式中訪問可在點擊PDF控件時可跳

把握人性的弱點——正確處理人際關係

正確處理人際關係 1,不要批評,指責或者抱怨 標記: 我們所要糾正和指責的人總是會為他們作自我辯護,並反過來指責我們。或者只是他們不知道:“我不知道怎麼做才能和以前不同”。 不議論別人,別人才不會議論你。 不要批評他們,如果我們跟他們在同樣的情況下,也會跟他們一樣的。——林肯

所謂的網頁爬蟲用java程式碼來實現,此程式碼適合在maven專案中使用中使用,因為,程式碼中的類所對應的依賴可以maven下載。

//獲得httpClient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); //url公司域名隨便 String url = "https://www.baidu.co

selenium自動化之處理瀏覽器警告彈窗

  有的網站會彈出類似如下圖的警告彈窗,你會發現這種彈窗在html原始碼中怎麼也定位不到,接下來將介紹這種彈窗的處理方式。     其實這種彈窗是不屬於html的元素的,他是屬於瀏覽器自帶的彈窗,所以用定位元素的方法是定位不了的。   瀏覽器的警告彈窗一共有三種:

用3行程式碼Python資料處理指令碼獲得4倍提速!

Python是一門非常適合處理資料和自動化完成重複性工作的程式語言,我們在用資料訓練機器學習模型之前,通常都需要對資料進行預處理,而Python就非常適合完成這項工作,比如需要重新調整幾十萬張影象的尺寸,用Python沒問題!你幾乎總是能找到一款可以輕鬆完成資料處理工作的Python庫。 然而,

IDEA使用之maven專案自動依賴jar包

作者:龍丿一  來源:CSDN  原文:https://blog.csdn.net/wuyanshen2012/article/details/76985225  當我們用manven構建專案的時候,我們在pom.xml中刪除一個依賴或者新增一個依賴,

Java中斷異常 InterruptedException 的正確處理方式

你看到這篇檔案可能是因為你已經呼叫了一個丟擲 InterruptedException 異常的方法,並且需要以某種方式處理它。 首先,需要了解為一個方法為啥會 throws InterruptedException, 是這個方法丟擲中斷異常作為方法簽名的一部分以及呼叫正在呼叫的方法的可能結果。因此,首先

修改STS的mavenmaven使用國內映象

                                      第一章:安裝maven庫 從官網上下載解壓版的maven並將其解壓,我這裡解壓到了D盤, 配置環境變數,新建系統變數MAVEN_HOME 並在path中新增。 至此我們安裝完成可以在dos

入門|三行Python程式碼,資料預處理速度提高2到6倍 python入門

在 Python 中,我們可以找到原生的並行化運算指令。本文可以教你僅使用 3 行程式碼,大大加快資料預處理的速度。 入門|三行Python程式碼,讓資料預處理速度提高2到6倍 Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更

三行Python程式碼,資料預處理速度提高2到6倍

小編有自己的Python學習交流群865597862 !進群可以免費領取2018Python最新的學習資料哦! Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理資料。但當我們面臨大量資料時,一些問題就會顯現…… 目前,大資料(

正確處理iOS從下方滑出滾動檢視

在iOS 11開始,從最早的地圖應用到最近的捷徑,陸續有系統應用使用從下方滑出列表的形式,這種系統提供的圓角風格檢視用手勢劃出和隱藏時非常自然流暢。國內的一些應用也跟進了這種互動方式,但是我發現很大一部分APP都沒有正確的處理ScrollView滾動和檢視滾動的銜接,以至於相比於系統應用不夠自然。比如知乎的

webgl第35課-深度緩衝-正確處理影象的位置關係

需要電子檔書籍可以Q群:828202939   希望可以和大家一起學習、一起進步!! 所有的課程原始碼在我上傳的資源裡面,本來想設定開源,好像不行!部落格和專欄同步! 如有錯別字或有理解不到位的地方,可以留言或者加微信15250969798,在下會及時修改!!!!!

如何解決maven正確導包但在工程目錄中顯示不出來的問題

        有的時候,明明把jar包匯入maven並且沒有任何報錯,但是maven工程下面並沒有顯示maven dependencies目錄,或者有這個目錄但沒有及時顯示出導進的包的名字,如下圖: 類似於這樣的

Feign呼叫微服務異常配合Hystrix的正確處理方式

這是本人在專案中總結出來的基礎服務異常的處理方式,同時也借鑑了其他部落格大神的內容整理出來的前提專案中全域性禁用了feign的hystirxfeign: hystrix: enabled: false 意味著,當基礎服務出現異常無法通過feign的fallback