「碼唄學(xué)院」七款JAVA靜態(tài)代碼掃描工具詳解甜攀,向BTA大廠看齊!

優(yōu)秀的團(tuán)隊(duì)為了保證可讀性琐馆、可維護(hù)性规阀、避免重復(fù)踩坑與保證代碼質(zhì)量,都會(huì)推出一些開發(fā)規(guī)范來遵守瘦麸。開發(fā)規(guī)范是前置主動(dòng)要求團(tuán)隊(duì)成員遵守的谁撼,而光靠意識(shí)是難以保證完全遵守規(guī)范的,所以還需要一些工具輔助滋饲。當(dāng)然即使有工具做這些事情彤敛,規(guī)范也是必須推廣的,讓大家先仔細(xì)讀讀了赌,畢竟直接寫出優(yōu)秀的代碼是最好的墨榄,然后再輔助工具乃最佳實(shí)踐。

開發(fā)規(guī)范

一流公司制定規(guī)范勿她,二流公司申請專利袄秩,三流公司生產(chǎn)產(chǎn)品。所以目前公開規(guī)范的大多是大廠的規(guī)范逢并。

目前知道大廠公開的Java開發(fā)規(guī)范

Google開發(fā)規(guī)范 github markdown格式 點(diǎn)我查看

阿里巴巴開發(fā)規(guī)范 PDF格式 點(diǎn)我查看最新版

華為開發(fā)規(guī)范

Oracle開發(fā)規(guī)范

阿里巴巴的開發(fā)規(guī)范之剧,雖然不是單純的規(guī)范,還包括了開發(fā)中的各種坑從主觀上的一些強(qiáng)制規(guī)定砍聊,但是總體上還是很有用的背稼,可以拿來部分or全部直接執(zhí)行。

獨(dú)立的組件

1. FindBugs

只尋找可能存在bug的地方玻蝌,不注重樣式或者格式蟹肘,它試圖只尋找真正的缺陷或者潛在的性能問題词疼。

特點(diǎn)

基于class分析,如果你clean了再去執(zhí)行發(fā)現(xiàn)沒有執(zhí)行生成報(bào)告帘腹,所以需要編譯后才能執(zhí)行分析

有maven插件贰盗,有IDE插件(eclipse插件,也有idea插件)

開發(fā)時(shí)不用使用maven插件阳欲,要編譯執(zhí)行檢測生成xml然后再生成網(wǎng)頁查看結(jié)果舵盈,挺麻煩。如果要與Jenkins集成的時(shí)候球化,maven插件就有用了秽晚,集成方式點(diǎn)我

開發(fā)時(shí)使用IDE插件非常方便

插件中Bug Explorer 中的灰色圖標(biāo)處為 Bug 類型,紅色圖標(biāo)表示 bug 較為嚴(yán)重筒愚,黃色的圖標(biāo)表示 bug 為警告程度

代碼缺陷分類

根據(jù)缺陷的性質(zhì)爆惧,大致可以分為下列幾類

Bad practice 不好的做法

Correctness 可能有不正確

Dodgy code 糟糕的代碼

Experimental 實(shí)驗(yàn)

Internationalization 國際化

Malicious code vulnerility 惡意的代碼漏洞

Multithreaded correctness 多線程問題

Performance 性能問題

FindBugs官方網(wǎng)站上也給出了一些案例:案例點(diǎn)我

排除單個(gè)規(guī)則

如果是排除一類規(guī)則,點(diǎn)擊IDE旁邊的提示選擇排除類型就行

可以針對規(guī)則排除單獨(dú)類中的接觸限制锨能,使用注解

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings

要加入依賴 provided代表只在編譯時(shí)依賴扯再,打包后就沒有這個(gè)依賴了IDE旁邊提示也有這種,不過不會(huì)加入以下依賴址遇,需要手動(dòng)在POM中加入

<dependency>

? ? <groupId>com.google.code.findbugs</groupId>

? ? <artifactId>annotations</artifactId>

? ? <version>3.0.1</version>

? ? <scope>provided</scope>

</dependency>

<dependency>

? ? <groupId>com.google.code.findbugs</groupId>

? ? <artifactId>jsr305</artifactId>

? ? <version>3.0.1</version>

? ? <scope>provided</scope>

</dependency>

2. CheckStyle

代碼樣式風(fēng)格檢查熄阻,專門check代碼規(guī)范風(fēng)格的,比如縮進(jìn)倔约,換行操作秃殉,命名大項(xiàng)目往往是有很多人一起完成的,然而每個(gè)人都有自己的style浸剩,導(dǎo)致整個(gè)項(xiàng)目的代碼不僅存在不符合語言規(guī)范的情況钾军,而且讀起來非常困難。因此绢要,這樣的項(xiàng)目中都會(huì)引入Checkstyle吏恭,來規(guī)范大家的編碼風(fēng)格,盡量做到統(tǒng)一和合理重罪。所以使用checkStyle檢查到問題

官方文檔:http://checkstyle.sourceforge.net/checks.html

工具界面

插件


單個(gè)文件check


特點(diǎn)

基于源碼樱哼,無需編譯

有maven插件,與IDE插件(eclipse插件剿配,也有idea插件)搅幅。idea的一些細(xì)節(jié)配置

可以自定義規(guī)則

CheckStyle底層基于antlr對源碼進(jìn)行處理

可以配置哪些文件不檢查

規(guī)范配置

配置位置


sun_checks.xml 默認(rèn)自帶sun公司的開發(fā)規(guī)范,有點(diǎn)嚴(yán)格

google_checks.xml 下載下來好像有點(diǎn)問題呼胚,可能與版本有關(guān) 查看

華為的規(guī)范 很多公司都會(huì)用華為的規(guī)范改改

自定義的規(guī)范 比較了解配置規(guī)則的情況下配置技巧

我們在代碼寫完之后茄唐,還要花時(shí)間去手動(dòng)解決Checkstyle提示的問題,這是一個(gè)非常無聊和耗時(shí)的工作蝇更。其實(shí)很多問題使用IDE的格式化已經(jīng)能解決一部分沪编,所以最好能提供一個(gè)IDE的formatter配置呼盆,整個(gè)團(tuán)隊(duì)都用這個(gè)配置導(dǎo)入IDE,這樣用用快捷鍵就能解決一些問題漾抬,非常easy宿亡。

3. PMD

與findbug類似找bug用常遂,還有規(guī)范纳令,比如說注釋不全

特點(diǎn)

有maven插件,與IDE插件(eclipse插件克胳,也有idea插件)

增強(qiáng)代碼質(zhì)量和修改代碼的功能

錯(cuò)誤分類

可能的bug——空的try/catch/finally/switch塊平绩。

無用代碼(Dead code):無用的本地變量,方法參數(shù)和私有方法漠另。

空的if/while語句捏雌。

過度復(fù)雜的表達(dá)式——不必要的if語句,本來可以用while循環(huán)但是卻用了for循環(huán)笆搓。

可優(yōu)化的代碼:浪費(fèi)性能的String/StringBuffer的使用性湿。

集合組件

1. IdeaIDE的QAPlug

這個(gè)插件是匯集這前面說的3個(gè)插件的結(jié)果,不用每次都運(yùn)行3個(gè)插件分別排錯(cuò)满败,1鍵運(yùn)行3個(gè)同時(shí)匯總整合肤频,非常方便,所以其他的不用裝了算墨,就用這個(gè)就行了宵荒!與sonar平臺(tái)的功能類似!如果公司沒有搭建sonarqube平臺(tái)的話净嘀,本地使用這個(gè)最佳

插件下載安裝

依次下載 QAPlug报咳、QAPlug-Checkstyle、QAPlug-FindBugs挖藏、QAPlug-PMD


分類

這個(gè)插件會(huì)把3個(gè)插件的錯(cuò)誤分類匯總

Efficiency 效能

Maintainability 可維護(hù)性

Reliability 可靠性

Usability 可用性

2. SonarQube

代碼質(zhì)量管理系統(tǒng)相當(dāng)于QAPlug的工程獨(dú)立出一個(gè)服務(wù)器部署暑刃,可以配置規(guī)則,掃描代碼膜眠,集成了很多靜態(tài)掃描工具2015年3月的時(shí)候就看到一篇文章介紹這個(gè)平臺(tái)了稍走,那時(shí)候還沒有太過關(guān)注,后來發(fā)現(xiàn)這個(gè)是個(gè)很好的平臺(tái)

3. Sonarlint

是SonarQube的配套的IDE插件柴底,配置遠(yuǎn)程服務(wù)器的地址,選取要拉去規(guī)則的項(xiàng)目婿脸,然后本地就可以執(zhí)行校驗(yàn)了,用的遠(yuǎn)程的規(guī)則這樣還是很方便的柄驻,規(guī)則可以同一在SonarQube維護(hù)狐树,不用每個(gè)人本地導(dǎo)入,團(tuán)隊(duì)的話用這個(gè)最適合

Sonarlint安裝與拉取列表失敗問題解決見

擴(kuò)充-Lint概念

Sonarlint是一個(gè)Lint工具鸿脓,其實(shí)Lint的含義就代表代碼靜態(tài)分析的工具抑钟,協(xié)助開發(fā)的工具涯曲,尤其是前端經(jīng)常使用,比如插件eslint:檢查JavaScript錯(cuò)誤非常方便

4. JArchitect

多種分析工具的聚合工具是一個(gè)商業(yè)性的收費(fèi)的分析工具可以匯聚checkstyle在塔、findbugs幻件、pmd的xml,然后分類總結(jié)生成圖表不過是收費(fèi)的蛔溃,也沒有idea插件绰沥,不用

代碼覆蓋率工具

idea自帶了代碼覆蓋率插件還不錯(cuò)跑單元測試的時(shí)候以代碼覆蓋率的方式運(yùn)行就行了一般邏輯覆蓋率60%就差不多了,核心模塊80%覆蓋標(biāo)準(zhǔn)即可

運(yùn)行方法




總結(jié)

首先要從意識(shí)上要遵守規(guī)范贺待,風(fēng)格統(tǒng)一徽曲,需要制定一份Java開發(fā)規(guī)范,我比較傾向于直接使用阿里的Java規(guī)范吧麸塞,簡單實(shí)用秃臣,也不過分嚴(yán)格其次要選擇靜態(tài)代碼工具,沒有SonarQube的話用QAPlug是很好的選擇哪工,有的話裝個(gè)Sonarlint插件就可以了代碼覆蓋率通過idea自帶的即可

有些人可能很排斥規(guī)范奥此,總感覺條條框框太多,不符合自己的自由風(fēng)格雁比,但是軟件不是開發(fā)完上線就結(jié)束的過程稚虎,而是需要持續(xù)迭代維護(hù)升級(jí)的過程,新人會(huì)接手章贞,要有可讀性可維護(hù)性祥绞。項(xiàng)目大了,人多了也是需要規(guī)范化才能更好的融合協(xié)作鸭限,讓混亂變得有序一個(gè)人的優(yōu)秀靠的是經(jīng)驗(yàn)蜕径,一個(gè)團(tuán)隊(duì)的優(yōu)秀靠的是規(guī)范。有了這些規(guī)范與工具败京,就可以大大的提高團(tuán)隊(duì)的整體素質(zhì)與水平兜喻,尤其是大廠開發(fā)人員,這個(gè)是必須有的赡麦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朴皆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泛粹,更是在濱河造成了極大的恐慌遂铡,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶姊,死亡現(xiàn)場離奇詭異扒接,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門钾怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碱呼,“玉大人,你說我怎么就攤上這事宗侦∮尥危” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵矾利,是天一觀的道長姑裂。 經(jīng)常有香客問我,道長梦皮,這世上最難降的妖魔是什么炭分? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任桃焕,我火速辦了婚禮剑肯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘观堂。我一直安慰自己让网,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布师痕。 她就那樣靜靜地躺著溃睹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胰坟。 梳的紋絲不亂的頭發(fā)上因篇,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音笔横,去河邊找鬼竞滓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吹缔,可吹牛的內(nèi)容都是我干的商佑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼厢塘,長吁一口氣:“原來是場噩夢啊……” “哼茶没!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晚碾,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤抓半,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后格嘁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛求,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣易。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画机。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖新症,靈堂內(nèi)的尸體忽然破棺而出步氏,到底是詐尸還是另有隱情,我是刑警寧澤徒爹,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布荚醒,位于F島的核電站,受9級(jí)特大地震影響隆嗅,放射性物質(zhì)發(fā)生泄漏界阁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一胖喳、第九天 我趴在偏房一處隱蔽的房頂上張望泡躯。 院中可真熱鬧,春花似錦丽焊、人聲如沸较剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽写穴。三九已至,卻和暖如春雌贱,著一層夾襖步出監(jiān)牢的瞬間啊送,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工欣孤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馋没,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓导街,卻偏偏與公主長得像披泪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子搬瑰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容