格拉德尔';s PMD插件:什么是可接受的参数? Java 1.7.0_40 格拉德尔1.10

格拉德尔';s PMD插件:什么是可接受的参数? Java 1.7.0_40 格拉德尔1.10,java,gradle,pmd,Java,Gradle,Pmd,我从未使用过Gradle的PMD插件,在尝试将规则集添加到我的build.Gradle时遇到了麻烦。不清楚规则集的有效值是什么。他们的例子是ruleSets=[“basic”,“brates”],它们链接到。不幸的是,没有太多事情要做 我猜部分标题以某种方式映射到有效字符串?像 ->“基本” ->“大括号” 但是像这样的事情呢 下面是一个正在运行的build.gradle示例: apply插件:“java” 应用插件:“pmd” 偏振模色散{ 规则集=[ //前两个更好,因为它在Javado

我从未使用过Gradle的PMD插件,在尝试将规则集添加到我的
build.Gradle
时遇到了麻烦。不清楚
规则集
的有效值是什么。他们的例子是
ruleSets=[“basic”,“brates”]
,它们链接到。不幸的是,没有太多事情要做

我猜部分标题以某种方式映射到有效字符串?像

  • ->“基本”
  • ->“大括号”
但是像这样的事情呢

下面是一个正在运行的
build.gradle
示例:

apply插件:“java”
应用插件:“pmd”
偏振模色散{
规则集=[
//前两个更好,因为它在Javadoc中是正确的。。。
“基本”,
“大括号”,
//这一个不起作用,其他变化如
//“空代码”、“空代码”、“空代码”、“空代码”不起作用。
“空代码”
]
}
存储库{
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 规则集文件如下所示:

注:本示例是为Gradle 1.10编写的。较新版本的Gradle(约2.0)使用较新版本的PMD;因此,许多
规则集
路径发生了变化。例如,
rulesets/logging java.xml
现在可以在
rulesets/java/logging java.xml
中找到


我意识到这是一个巨大的编辑,但它本质上是一个不同的答案。因此,在与您交谈并玩转它之后,我确定Gradle插件使用的pmd库版本比发布的版本稍旧(即4.3版);但是,插件中缺少一些规则集,因为最新的pmd版本是5.0.5,它与Gradle和Java的
NullPointerException
冲突。现在,在编写了可能是我一生中语法最正确、最费劲的Hello World Java程序来测试所有这些之后,我已经编译了目前使用Gradle插件的每一个Java规则集:

下面是Main.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");
    }
}
这是build.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()
}
现在您可能想知道,哪些规则集还不受支持?答案是:

  • “评论”
  • “空的”
  • “不必要的”
  • 相信我,当我说,其余的规则工作完美。他们在写《你好世界》时把我撕成碎片。因此,我希望这能有所帮助,定义了所有Java rulesets.xml文件的目录位于:我忽略了迁移文件,因为它们不起作用。我想他们是为了一些特定的东西


    祝你好运,我会在gradle论坛上提出缺少规则集的问题,请求添加这些规则集,或者更新版本。或者,如果您真的非常需要缺少的规则集,您可以自定义编译插件并将其链接到较新的pmd版本

    使用kuporific描述的自己的rulset.xml文件时,如:

    pmd {
    ruleSetFiles = files('path/to/ruleSet.xml')
    }
    
    Gradle1.10使用某种默认规则。是的,如果文件路径错误,它会抱怨;如果内容无效,它会抱怨。但在检查期间,将应用一些默认规则集。所以我有点惊讶这对你有用

    另见:

    解决方法不是使用规则集文件,而是逐个引用它们:

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

    在这里添加其他优秀答案。将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
    

    这些可能不会全部实施,但这是一个很好的起点。有关每个文件的说明,您可以查看文档。

    gradle支持最新版本的
    PMD
    5.1.3
    ,在编写此答案时)。规则集需要以
    java-

    我用
    gradle-1.12

    要在gradle中使用
    PMD 5.1.3
    ,以下配置定义了我可以找到的所有可能的规则集:

    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'
                ]
    }
    

    参考:

    显然这是一个插件版本问题。哎哟。也许有一种方法可以使用toolVersion子命令来解决这个问题,但是插件坏了,抛出了5.0.5(最新)版本的空指针,不确定到底是怎么回事。也许给pmd的人留个口信。还有,我要删除旧的评论,我要清理一下,很好!非常彻底。谢谢你的帮助。(完全改变你的答案绝对没有错。)对不起,我不明白。Gradle说
    规则集文件
    用于“自定义规则集文件”,而
    规则集
    用于“内置规则集”。在您链接到的问题中,它们似乎有自定义pmd规则集(在“$projectRoot/buildtools/pmd rules/”中,该目录不是内置的Gradle目录)。论坛建议,这从1.4中断到1.5-rc-1,但已在1.5-rc-2中修复。临时解决方法是设置
    规则集
    ,而不是
    规则集文件
    。您能描述一下如何重现您看到的问题吗?我们有一个“自定义规则集文件”,我想从规则中排除。我把它写进了文件,但没有效果。当通过ant运行pmd时,它会这样做。当运行gradle时,pmd配置为“ruleSets=filepath”,如上所示,它也可以工作。有点奇怪,它似乎对你有用。我用jdk8,gradle 1.10在windows7上运行这个程序。我还没能重现你的问题,但我真的很好奇。你能为它提出一个问题吗?我认为这是值得深入研究的。它可能真的依赖于系统。。?我想我必须创建一个简单的示例项目设置来进一步研究。一旦我有空闲时间,我可能会那样做。谢谢