Плагин PMD Gradle: каковы приемлемые аргументы?

  • Java 1.7.0_40
  • ш 1.10

я никогда не использовал плагин PMD Gradle, и у меня проблемы с добавлением наборов правил в мой build.gradle. The документация Pmd не ясно, какие допустимые значения ruleSets есть. Их пример ruleSets = ["basic", "braces"] и они ссылаются на "официальный список". К сожалению, здесь не на что опереться.

я угадал разделе название карты действительны каким-то образом? Как,

но как насчет таких вещей, как " пустой код (java)"?

вот работает build.gradle пример:

apply plugin: 'java'
apply plugin: 'pmd'

pmd {
    ruleSets = [
            // The first two better work since it's right in the Javadoc...
            "basic",
            "braces",
            // This one does not work and other variations like 
            // "empty code", "emptycode", "empty-code", "empty_code" do not work.
            "emptyCode"
    ]
}
repositories {
    mavenCentral()
}

Gradle выплевывает следующую ошибку:

$ gradle check
:pmdMain FAILED                                                                  

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':pmdMain'.
> Can't find resource emptyCode.  Make sure the resource is a valid file or URL 
    or is on the CLASSPATH.  Here's the current classpath:
    /Users/kuporific/gradle/gradle-1.10/lib/gradle-launcher-1.10.jar

* Try:        
Run with --stacktrace option to get the stack trace. Run with --info or --debug 
    option to get more log output.

BUILD FAILED  

Total time: 9.907 secs

работает с --stacktrace или --debug как было предложено, похоже, ничего не дает полезный...

Примечание: создайте пустой файл типа src/main/java/Dummy.java. В противном случае, сборка будет получится.

как ruleSets должно подлежит декларированию?


Edit:

оказалось, что проще объявить xml набор правил, потому что она предлагает точный контроль над правилами. Он включен в build.gradle вот так:

apply plugin: 'pmd'

pmd {
    ruleSetFiles = files('path/to/ruleSet.xml')
}

и файл набора правил выглядит примерно так это:

Примечание: этот exaple написан для Gradle 1.10. Более новые версии Gradle (около 2.0) используют более новую версию PMD; поэтому многие из rulesets измененными путями. Так что rulesets/logging-java.xml в настоящее время в rulesets/java/logging-java.xml, например.

<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="Android Application Rules"
    xmlns="http://pmd.sf.net/ruleset/1.0.0"
    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 
                        http://pmd.sf.net/ruleset_xml_schema.xsd" >

    <rule ref="rulesets/logging-java.xml" />
    <rule ref="rulesets/basic.xml" />
    <rule ref="rulesets/braces.xml" />
    <rule ref="rulesets/codesize.xml" >
        <exclude name="TooManyMethods" />
    </rule>
    <rule ref="rulesets/controversial.xml">
        <exclude name="UseConcurrentHashMap" />
        <exclude name="AvoidLiteralsInIfCondition" />
        <exclude name="DataflowAnomalyAnalysis" />
        <exclude name="CallSuperInConstructor" />
        <exclude name="AtLeastOneConstructor" />
        <exclude name="NullAssignment" />
    </rule>
    <!-- etc... -->
</ruleset>

4 ответов


Я понимаю, что это огромное редактирование, но это по существу другой ответ. Поэтому, поговорив с вами и поиграв с ним, я определил, что плагин Gradle использует немного более старую версию библиотеки pmd, чем опубликована (а именно, версия 4.3); однако в плагине отсутствует несколько наборов правил, так как самая последняя версия pmd-5.0.5, которая ломается с NullPointerException С Gradle и Java. Теперь, после написания, возможно, самого синтаксически правильного и кропотливого Hello Чтобы проверить все это, я собрал каждый набор правил Java, который работает с плагином Gradle на данный момент:

здесь главный.java:

package william;
import java.util.logging.Logger;

public final class Main{
    private Main(){}
    public static void main(final String [ ] args){
        final Logger log = Logger.getLogger(Main.class.getName());
        log.fine("Hello World");
    }
}

вот сборка.Gradle в:

apply plugin: 'java'
apply plugin: 'pmd'

pmd {
    ruleSets = [
            "basic",
            "braces",
            "naming",
            "android",
            "clone",
            "codesize",
            "controversial",
            "design", 
            "finalizers",
            "imports",
            "j2ee",
            "javabeans",
            "junit",
            "logging-jakarta-commons",
            "logging-java",
            "migrating",
            "optimizations",
            "strictexception",
            "strings",
            "sunsecure",
            "typeresolution",
            "unusedcode"
            ]
}
repositories {
    mavenCentral()
}

и теперь вам может быть интересно, какие наборы правил еще не поддерживаются? ну и ответ:

  1. "comments"
  2. "empty"
  3. "unnecessary"

поверьте мне, когда я говорю, остальные правила работают безупречно. Они разорвали меня на части, когда писали Hello World. Итак, я надеюсь, что это поможет, каталог, в котором есть все наборы правил Java.xml-файлы определяются по адресу:ссылка на каталог набора правил Java GitHub pmd я игнорирую мигрирующие, потому что они не работали. Я думаю, они для чего-то конкретного.

удачи, и я бы поднял вопрос о недостающих наборах правил на форумах gradle, чтобы ходатайствовать о их добавлении или обновлении версии. Или вы может ли пользователь скомпилировать плагин и связать его с новой версией pmd, если вы действительно отчаянно нуждаетесь в отсутствующих наборах правил.


последняя версия PMD (5.1.3 при написании этого ответа) поддерживается gradle. Наборы правил должны иметь префикс java-

при этом gradle-1.12

использовать PMD 5.1.3 С gradle следующая конфигурация определяет все возможные наборы правил, которые я мог найти:

pmd {
    toolVersion = '5.1.3'
    ruleSets = [
            'java-android',
            'java-basic',
            'java-braces',
            'java-clone',
            'java-codesize',
            'java-comments',
            'java-controversial',
            'java-coupling',
            'java-design',
            'java-empty',
            'java-finalizers',
            'java-imports',
            'java-j2ee',
            'java-javabeans',
            'java-junit',
            'java-logging-jakarta-commons',
            'java-logging-java',
            'java-migrating',
            'java-naming',
            'java-optimizations',
            'java-strictexception',
            'java-strings',
            'java-sunsecure',
            'java-typeresolution',
            'java-unnecessary',
            'java-unusedcode'
            ]
}

ссылки: http://forums.gradle.org/gradle/topics/_pmdtest_fails_with_cant_find_resource_null_when_rulesets_include_braces_gradle_2_0_rc_1


чтобы добавить к другим отличным ответам здесь. После применения pmd к вашей сборке gradle и вызова его через gradle pmdMain, PMD jar будет загружен в ваш кэш gradle. Оттуда вы можете бежать:

find ~/.gradle -name "*pmd*.jar" -exec jar -tvf {} \;|grep rulesets

и вы получите на выходе:

0 Thu Nov 10 20:48:06 EST 2011 rulesets/
     0 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/
     0 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/
 18068 Thu Nov 10 20:48:06 EST 2011 rulesets/naming.xml
    65 Thu Nov 10 20:48:06 EST 2011 rulesets/jsprulesets.properties
   710 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_15.xml
   483 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_14.xml
  1048 Thu Nov 10 20:48:06 EST 2011 rulesets/rulesets.properties
  3017 Thu Nov 10 20:48:06 EST 2011 rulesets/javabeans.xml
  2089 Thu Nov 10 20:48:06 EST 2011 rulesets/sunsecure.xml
   777 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_junit4.xml
  3198 Thu Nov 10 20:48:06 EST 2011 rulesets/scratchpad.xml
 13190 Thu Nov 10 20:48:06 EST 2011 rulesets/strings.xml
  1379 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/all-java.xml
  2639 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/dogfood.xml
  6036 Thu Nov 10 20:48:06 EST 2011 rulesets/finalizers.xml
  5347 Thu Nov 10 20:48:06 EST 2011 rulesets/logging-jakarta-commons.xml
 13629 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating.xml
   610 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_13.xml
  3593 Thu Nov 10 20:48:06 EST 2011 rulesets/braces.xml
  4163 Thu Nov 10 20:48:06 EST 2011 rulesets/clone.xml
   702 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/33.xml
  1332 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/41.xml
  1009 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/35.xml
   395 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/43.xml
  1340 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/40rc1.xml
  1110 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/34.xml
   537 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/38.xml
   346 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/37-jsp.xml
   393 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/37.xml
   744 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/39.xml
  1066 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/36.xml
  1256 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/42.xml
  6379 Thu Nov 10 20:48:06 EST 2011 rulesets/android.xml
  4967 Thu Nov 10 20:48:06 EST 2011 rulesets/logging-java.xml
 11557 Thu Nov 10 20:48:06 EST 2011 rulesets/j2ee.xml
 52926 Thu Nov 10 20:48:06 EST 2011 rulesets/design.xml
  9216 Thu Nov 10 20:48:06 EST 2011 rulesets/basic-jsp.xml
 37773 Thu Nov 10 20:48:06 EST 2011 rulesets/basic.xml
  3981 Thu Nov 10 20:48:06 EST 2011 rulesets/imports.xml
  3836 Thu Nov 10 20:48:06 EST 2011 rulesets/typeresolution.xml
  2755 Thu Nov 10 20:48:06 EST 2011 rulesets/unusedcode.xml
 25043 Thu Nov 10 20:48:06 EST 2011 rulesets/controversial.xml
  3045 Thu Nov 10 20:48:06 EST 2011 rulesets/coupling.xml
 13379 Thu Nov 10 20:48:06 EST 2011 rulesets/strictexception.xml
 12787 Thu Nov 10 20:48:06 EST 2011 rulesets/codesize.xml
 12484 Thu Nov 10 20:48:06 EST 2011 rulesets/junit.xml
 10784 Thu Nov 10 20:48:06 EST 2011 rulesets/optimizations.xml
  1412 Thu Nov 10 20:48:06 EST 2011 rulesets/basic-jsf.xml
  1396 Thu Nov 10 20:48:06 EST 2011 rulesets/favorites.xml

они не могут быть реализованы, но это хорошая отправная точка. Для описания каждого файла, вы можете проверить документацию здесь.


при использовании собственного набора правил.xml-файл, как описано в kuporific, например:

pmd {
ruleSetFiles = files('path/to/ruleSet.xml')
}

gradle 1.10 использует какие-то правила по умолчанию. Да, он жалуется, если путь к файлу неправильный, да, он жалуется, если содержимое недействительно. Но во время проверок будет применен набор правил по умолчанию. Так что я удивлен, что это сработало для тебя.

Также см.: http://forums.gradle.org/gradle/topics/with_gradle_1_5_pmd_applying_basic_rules_even_when_they_are_not_included_in_our_rule_set_files

обходной путь не использовать ruleSetfiles, но ссылаться на них один за другим:

ruleSets = [ "$projectRoot/buildtools/pmd-rules/strings.xml"]