欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线

4.PMD使用,編譯和自定義規則

一 PMD簡介

成都網站制作、做網站,成都做網站公司-創新互聯已向上千家企業提供了,網站設計,網站制作,網絡營銷等服務!設計與技術結合,多年網站推廣經驗,合理的價格為您打造企業品質網站。

PMD是一款代碼靜態檢查工具,可以檢查出很多代碼中潛在的bug以及讓人感到疑惑的代碼,具體大家可以百度下。

二 PMD源代碼下載

下載地址:

https://github.com/pmd/pmd/tree/pmd/5.5.x

需要注意的是注意選擇branch,一般選擇最新的branch;然后可以用git clone下來,或者直接下載zip壓縮包。

4. PMD 使用,編譯和自定義規則

如下:

4. PMD 使用,編譯和自定義規則

從上圖也可以看到,pmd支持的語言有很多,java的檢測那就是在pmd-java里面。

三 maven下載和環境變量配置

參考網址:

http://blog.csdn.net/jiuqiyuliang/article/details/45390313

  1. 下載maven

    地址:maven下載

  2. 配置MAVEN_HOME和path

  3. 檢測maven環境:開始菜單->運行->cmd->mvn -v

如下圖:

4. PMD 使用,編譯和自定義規則

四 配置JDK

這個網上資料太多了,就不細說了, 比如:

http://www.cnblogs.com/smyhvae/p/3788534.html

五 編譯PMD

  1. 在home目錄配置 ~/.m2/toolchains.xml 這里我發現分兩種情況:

    第一種,我在本地裝了git bash,所以打開git bash后,敲入cd ~,如下圖:

  

  4. PMD 使用,編譯和自定義規則

  那這種的話直接在c/users/rongwei.huang目錄創建./m2/toolchains.xml文件

  可以把PMD源代碼目錄下example-toolchains.xml文件拷貝過去,改成toolchains.xml

  如下:

  4. PMD 使用,編譯和自定義規則

 

  4. PMD 使用,編譯和自定義規則

  修改toolchains.xml,主要就是配置JDK版本和路徑,我使用JDK1.8編譯,所以配置如下:

 

<?xml version="1.0" encoding="UTF8"?>
<toolchains>
  <!-- place this file in ${user.home}/.m2/toolchains.xml -->
  <!-- adjust the paths to jdkhome -->

  <toolchain>
    <type>jdk</type>
    <provides>
      <version>1.8</version>
    </provides>
    <configuration>
      <jdkHome>/path/to/jdk/1.8</jdkHome>                                                   <!-- Linux -->
      <jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home</jdkHome>    <!-- MacOSX -->
      <jdkHome>h:\\Android\\jdk1.8.0_25</jdkHome>                                     <!-- Windows -->
    </configuration>
  </toolchain>
</toolchains>

 

  

 第二種,就是沒有安裝類似git bash這種linux環境軟件,這種我沒有試過,別的帖子有介紹:

 PMD編譯

2. 編譯PMD源代碼

配置完toolchains.xml之后,在PMD源代碼目錄打開命令行,執行

mvn clean package

如下圖:

4. PMD 使用,編譯和自定義規則

3. 編譯遇到問題

在編譯的時候,我遇到下面兩個問題:

a. java doc 編譯失敗

可以參考這篇帖子解決方法: PMD Java doc '->'編譯失敗

b. 測試項EcmascriptTokenizerTest沒有通過

我直接把它注釋掉了

4. 編譯成功,查看結果

4. PMD 使用,編譯和自定義規則

在PMD源代碼pmd-dist目錄,target文件夾查看zip文件

4. PMD 使用,編譯和自定義規則

5. 解壓PMD

拷貝pmd-bin-5.5.8-SNAPSHOT.zip到一個沒有中文字符的路徑,然后解壓。

解壓后,主要包括bin和lib兩個文件夾

bin是可執行程序,下面我們會用里面的程序編寫自定義規則。

lib包含很多jar包,jar包里面包含規則的實現以及描述的xml文件。

4. PMD 使用,編譯和自定義規則

六 自定義PMD規則

可以參考這篇帖子: 自定義PMD規則, 不過也說說自己的操作方法

  1. eclipse打開PMD源代碼工程

  為了寫代碼方便一點,可以用Eclipse來打開,具體是:

  File->New->Java Project->去掉Use default location->選擇PMD的源代碼路徑->finish

  4. PMD 使用,編譯和自定義規則

2. 創建規則檢測類

在java規則里面創建一個新的規則類WhileLoopMustUseBracesRule.java,繼承自AbstractJavaRule.java

路徑:

pmd-source\pmd-java\src\main\java\net\sourceforge\pmd\lang\java\rule\

如上面那個帖子說的,我們要創建一個規則檢測java代碼while循環必須有{}

也就是這種寫法是錯誤的:

while(condition)

  i++;

需要改成這樣

while(condition) {

  i++;

}

所以,我們需要一個類來檢測它。

如下:

4. PMD 使用,編譯和自定義規則

這個類主要重寫了檢測方法visit,至于為什么這么寫,可以參考上面這個帖子:自定義PMD規則

3. 創建描述性xml

在pmd-source\pmd-java\src\main\resources\rulesets\java\目錄下創建自定義規則的描述性xml,在這個目錄可以看到很多已經有的xml,比如:

4. PMD 使用,編譯和自定義規則

其中android.xml表示的是針對android的檢測,basic.xml表示基本通用的檢測。

那我們也可以把basic.xml拷貝一份,改成自定義的xml,比如mycustomrules.xml

如下:

<?xml version="1.0"?>

<ruleset name="mycustomrule"
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
  <description>custom rule</description>

	<rule name="WhileLoopsMustUseBracesRule"
    	  language="java"
    	  since="5.6"
          message="while loop must has braces as first element you are in error!!!"
          class="net.sourceforge.pmd.lang.java.rule.WhileLoopMustUseBracesRule"
          externalInfoUrl="${pmd.website.baseurl}/rules/java/basic.html#JumbledIncrementer">
     <description>while loop must has braces as first element</description>
     <priority>3</priority>
     <example>
 <![CDATA[
class Example {

  void bar() {
     while(baz)   //need has {}
        buz.doSomething();
  }
}
 ]]>
     </example>
     </rule>
</ruleset>

上面有幾個描述性信息:

description: 自定義規則描述

rule name: 名稱

language: java

since: 表示從哪個pmd版本開始有這個規則

message: 用來提示用戶出錯的描述性信息

class: 表示具體用來檢測的類,也就是我們自定義的那個類

externalInfoUrl: 在生成的html報告中,用來給用戶點擊跳轉到幫助頁面的鏈接。在幫助頁面有這個錯誤的更詳細的描述信息;

description: 出錯描述

priority: 優先級

example: 出錯示例

4. 編譯打包

在PMD源代碼下面的pmd-java目錄,打開命令行,執行

mvn clean package

4. PMD 使用,編譯和自定義規則

在編譯目錄pmd-source\pmd-java\target\下查看編譯結果

pmd-java-5.5.8-SNAPSHOT.jar

可以用壓縮工具查看這個jar是否包含了我們自定義的xml和java文件

4. PMD 使用,編譯和自定義規則

4. PMD 使用,編譯和自定義規則

5. 拷貝生成的jar到PMD-bin解壓目錄

在上面第五步,我們編譯了PMD源代碼,并且生成了pmd bin壓縮包。然后拷貝到了一個沒有中文字符的目錄。

那我們現在繼續把java編譯的jar包,拷貝過去,路徑是pmd-bin的lib下面,如下:

4. PMD 使用,編譯和自定義規則

6. 利用自定義規則檢測java代碼

在pmd-bin目錄打開命令行,執行

pmd.bat -d e:\work_space\Android-Prototype\app\src\main -f html -R java-mycustomrules

解釋下參數:

-d: 表示你要檢查的java源代碼目錄

-f: 表示輸出的內容格式是html

-R: 表示要使用的規則,上面表示的是java里面的mycustomrules規則

4. PMD 使用,編譯和自定義規則

其中hello pmd使我們打印的log: 

System.out.println("hello pmd");

上面檢測到一個錯誤BaseActivity.java 78行有個while循環沒有用{}

代碼如下:

4. PMD 使用,編譯和自定義規則

七 用xpath語法自定義規則

這個可以參考帖子 xpath自定義規則

八 在AndroidStudio中配置PMD

  1. 增加配置模塊

    可以新建一個module為config,在config module的quality.gradle里面配置pmd的task,如下:

  2. apply plugin: 'pmd'
  3. check.dependsOn 'pmd'
    
    task pmd(type: Pmd) {
        ruleSetFiles = files("${project.rootDir}/config/quality/pmd/java/basic.xml", //基本代碼規范
                "${project.rootDir}/config/quality/pmd/java/android.xml") //android相關
        ruleSets = []
        ignoreFailures = true
    
        source 'src'
        include '**/*.java'
        exclude '**/gen/**'
    
        reports {
            xml.enabled = true
            html.enabled = true
            xml {
                destination "${project.buildDir}/reports/pmd/pmd.xml"
            }
            html {
                destination "${project.buildDir}/reports/pmd/pmd.html"
            }
        }
    }

    簡單描述下這幾個屬性:

    ruleSetFiles: 自定義的檢測文件集合

    ruleSets=[]: 表示不用默認的檢測xml,使用自定義的

    如果沒有自定義規則,可以用系統的,那么ruleSets可以這樣寫:

    ruleSets = ["java-unusedcode", "java-basic"]

    中括號表示要檢測的類型,不過這樣有個缺點,如果我想去除java-basic里面一項檢查,很難做到,不如自定義規則方便。

    ignoreFailures=true: 表示如果有錯誤,那么編譯報錯;如果是false,則只是輸出錯誤報表,并不會中斷編譯。

    source:目錄

    include: 包含文件

    exclude: 不包含的文件

    reports:輸出報表的路徑, xml.enabled表示是否輸出xml。

  4. 在app的build.gradle增加對這個模塊gradle的引用

  5. apply from: '../config/quality.gradle'

  6. 執行編譯

  可以右擊AndroidStudio的gradle里面pmd這個task(如果沒有的話,可以build->rebuild project,在右邊Gradle Projects里面刷新下)

  4. PMD 使用,編譯和自定義規則

  或者在項目根目錄,執行gradle pmd

    

7. 在Android Studio里面點擊pmd和在命令行執行 gradle pmd的區別

  上面介紹了兩種啟動pmd檢查的方法: Android Stdudio中點擊pmd和命令行中興gradle pmd

  我發現這種方法的檢查結果不盡相同,經過仔細檢查,終于發現了原因:

  所用的pmd版本不同

  a. Android Studio中點擊pmd按鈕執行的的pmd版本路徑如下:

    File->Settings->搜索gradle,如下圖:

    4. PMD 使用,編譯和自定義規則

  那我的Android Studio編譯pmd使用的pmd路徑就是 D:/gradle_jar_cache

  這個路徑是我自己配置的。

 

  如果這個路徑下沒有pmd,那么它會去下載,下載的路徑在項目下面的build.gradle中配置,也即是maven服務器地址。

  

allprojects {
    repositories {
//        jcenter()
        maven {
            url '   
        }
        

        mavenCentral()
    }
}

  

   b. 命令行執行gradle pmd

   

   說下這種方法的pmd路徑,因為自己在Gradle里面找了好久也沒有找到,后面突然想到了默認路徑,也就是"c:\Users\rongwei.huang\.gradle\"

   自己就把這個文件夾備份后刪除,再在命令行執行gradle pmd,果然它首先就去進行了下載jar包操作。

   在這個目錄搜索pmd,發現它的版本是5.2.3與Android Studio里面用的5.5.4不一樣,所以兩者會有不同的檢查結果。

   因為我的是UnusedPrivateMethod 檢查不同,也就是沒有被使用的私有方法檢查,5.2.3會誤報;所以我對比了下源代碼。

   5.2.3的源代碼沒有找到,拿5.0版本和5.5.4版本對比,發現它們的實現不一樣:

4. PMD 使用,編譯和自定義規則

   

4. PMD 使用,編譯和自定義規則  

   

   

   

c. 疑問

   1. Gradle在哪里配置pmd版本的呢?比如我的會自動下載5.2.3,那這個是在哪里配置的呢?

   2. Gradle是在哪里配置默認pmd路徑的呢?也就是"c:\Users\rongwei.huang\.gradle\"

   這兩點沒有找到。

   如果有找到的同學,可以留言告訴我,謝謝~

````分割線````

已經找到了Gradle為什么會下載到c:\Users\rongwei.huang\.gradle\, 這個是當前用戶根目錄。

如果要修改的話,可以添加環境變量“GRADLE_USER_HOME”,為它設置一個目錄即可。

詳見gradle-wrapper.properties

#Mon Sep 12 15:17:35 CEST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-rc-1-bin.zip

附錄:

下面是pmd的一些相關網址

  1.  PMD github源代碼  下載時注意branch

  2.  PMD介紹 包括大部分PMD檢查分類的介紹,比如basic是干什么

  3.  PMD自定義規則的實現

  4.  PMD官網

  5.  安裝maven

  6.  PMD java doc編譯失敗

謝謝上面的博主。

新聞名稱:4.PMD使用,編譯和自定義規則
分享網址:http://m.kartarina.com/article0/gcieio.html

成都網站建設公司_創新互聯,為您提供云服務器網站收錄網站建設網站排名小程序開發手機網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司
欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线
午夜精品福利一区二区蜜股av| 国产欧美精品区一区二区三区| 成人午夜免费av| 另类小说视频一区二区| 日本成人在线视频网站| 奇米色一区二区| 捆绑调教美女网站视频一区| 3751色影院一区二区三区| 欧美日韩小视频| 日韩亚洲欧美综合| 26uuu国产一区二区三区| 欧美精品一区二区三区蜜桃| 国产亚洲精品资源在线26u| 国产欧美一区二区精品性色超碰 | 欧美色图第一页| 亚洲午夜羞羞片| 五月婷婷色综合| 精品中文字幕一区二区| 国产成人精品午夜视频免费| av一二三不卡影片| 6080日韩午夜伦伦午夜伦| 亚洲精品在线观| 亚洲精品视频在线| 青娱乐精品在线视频| 成人精品高清在线| 欧美久久免费观看| 国产欧美综合色| 日日摸夜夜添夜夜添亚洲女人| 激情国产一区二区| 日本高清成人免费播放| 日韩欧美中文一区| 亚洲精品第一国产综合野| 麻豆精品在线看| 色www精品视频在线观看| 欧美大黄免费观看| 亚洲免费观看高清| 国产麻豆成人精品| 在线播放视频一区| 国产精品电影院| 久久精品99国产精品| 色偷偷88欧美精品久久久| 日韩一二在线观看| 亚洲一区电影777| 成人黄色电影在线 | 国产成人午夜99999| 欧美日韩国产色站一区二区三区| 久久精品欧美日韩精品| 天堂va蜜桃一区二区三区 | 综合自拍亚洲综合图不卡区| 免费黄网站欧美| 欧美亚洲免费在线一区| 国产精品久久久久久久久免费桃花| 免费在线看成人av| 欧美视频你懂的| 亚洲人成网站色在线观看| 国产成人精品一区二| 欧美一区二区三区公司| 婷婷成人激情在线网| 亚洲一区在线观看视频| 成人av在线资源网站| 久久精品一二三| 国产麻豆精品视频| 欧美精品一区二区三区久久久| 欧美日韩免费观看一区三区| 亚洲人成小说网站色在线 | 成人一级黄色片| 久久女同性恋中文字幕| 麻豆国产欧美日韩综合精品二区| 在线亚洲高清视频| 性感美女久久精品| 欧美日韩国产精品成人| 污片在线观看一区二区| 欧美日韩免费在线视频| 午夜欧美视频在线观看| 欧美影视一区在线| 亚洲国产精品视频| 制服丝袜成人动漫| 蜜桃久久久久久| 久久久蜜桃精品| 成人午夜免费电影| 亚洲精品乱码久久久久久黑人 | 99久久久久久| 亚洲另类在线视频| 日本视频免费一区| 中国色在线观看另类| 亚洲欧美一区二区三区孕妇| 99国产精品99久久久久久| 亚洲四区在线观看| 欧美日韩在线亚洲一区蜜芽| 日本一区中文字幕| 26uuuu精品一区二区| 成人视屏免费看| 一区二区在线观看免费视频播放| 色婷婷综合激情| 日韩电影在线看| 国产日韩精品视频一区| 色88888久久久久久影院野外| 亚洲va国产天堂va久久en| 精品国产乱码久久久久久浪潮| 成人激情图片网| 亚洲444eee在线观看| 26uuu亚洲综合色欧美| 色婷婷一区二区三区四区| 日本不卡在线视频| 欧美国产精品劲爆| 欧美精品99久久久**| 成人黄色国产精品网站大全在线免费观看| 国产精品第五页| 91麻豆精品国产91久久久久 | 成人免费视频播放| 日日夜夜免费精品| 国产女人水真多18毛片18精品视频| 91美女蜜桃在线| 国产麻豆精品久久一二三| 一区二区三区精品久久久| 久久久综合视频| 欧美日韩mp4| av不卡免费电影| 麻豆91小视频| 亚洲电影视频在线| 国产精品久久久久久久久搜平片 | 日韩一级高清毛片| 色哟哟一区二区三区| 九色|91porny| 青青草国产成人av片免费| 亚洲欧美aⅴ...| 欧美激情一区二区三区四区| 欧美一区二区国产| 91精品久久久久久蜜臀| 日本韩国欧美一区二区三区| 成人在线一区二区三区| 精品在线播放午夜| 日产欧产美韩系列久久99| 一区二区三区精品在线观看| 国产精品一二三区| 蜜桃传媒麻豆第一区在线观看| 亚洲三级免费电影| 国产精品福利一区二区三区| 久久综合成人精品亚洲另类欧美| 欧美色图激情小说| 亚洲人成小说网站色在线| 国产精品另类一区| 中文子幕无线码一区tr| 国产三级久久久| 亚洲国产精品高清| 国产午夜亚洲精品不卡| 久久精品水蜜桃av综合天堂| 久久青草欧美一区二区三区| 欧美精品一区二区三区四区| 精品噜噜噜噜久久久久久久久试看| 欧美高清视频不卡网| 在线观看91精品国产麻豆| 欧美日韩成人综合在线一区二区| 欧美日韩成人综合天天影院 | 国产一区二区精品久久| 国内精品在线播放| 久久99精品久久久久久久久久久久 | 亚洲品质自拍视频| 一区二区三区美女视频| 亚洲国产精品久久人人爱蜜臀| 亚洲国产乱码最新视频| 日韩成人免费在线| 国产一区二区在线观看视频| 国产福利一区在线| av不卡免费在线观看| 欧美视频三区在线播放| 欧美va亚洲va在线观看蝴蝶网| 狠狠色伊人亚洲综合成人| 国产乱一区二区| 一本久久精品一区二区| 欧美日韩精品欧美日韩精品| 欧美一级高清片| 国产精品天干天干在线综合| 亚洲美女屁股眼交| 久久99国产乱子伦精品免费| 国产999精品久久久久久| 色综合天天综合狠狠| 91麻豆精品国产91| 欧美极品另类videosde| 亚洲自拍与偷拍| 久久国产精品99精品国产| 国产精品私人影院| 亚洲电影第三页| 国产成人综合亚洲91猫咪| 色婷婷激情一区二区三区| 日韩欧美在线不卡| 亚洲欧美激情一区二区| 激情六月婷婷综合| 欧美日本在线观看| 亚洲国产成人一区二区三区| 婷婷开心久久网| av影院午夜一区| 欧美成人一区二区三区| 亚洲一区在线看| 风间由美性色一区二区三区| 午夜影院久久久| 99久久精品免费观看| 2020国产精品久久精品美国| 亚洲精品乱码久久久久久| 国产精品中文有码|