当前位置: 首页 > 知识库问答 >
问题:

如何使用gradle-pmd-plugin将自定义java pmd规则添加到gradle项目?

岳鸿畴
2023-03-14

在处理arch4u-pmd项目期间,我们制定了几个基于java的pmd规则,在基于XML的规则集< code>our-rules.xml中配置它们,并将其作为普通的java库/工件(< code > io . github . ABC:my-PMD-rules:0 . 1 . 0 )发布到我们的工件存储库中。工件结构如下所示:

> unzip -l my-pmd-rules-0.1.0.jar   
Archive:  my-pmd-rules-0.1.0.jar   
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  02-15-2022 00:24   META-INF/
      139  02-15-2022 00:24   META-INF/MANIFEST.MF
        0  02-15-2022 00:24   io/
        0  02-15-2022 00:24   io/github/
        0  02-15-2022 00:24   io/github/rules/
        ...
     4781  02-15-2022 00:24   io/github/rules/MissingMandatoryAnnotation.class
     ...
     1138  02-15-2022 00:24   io/github/rules/our-rules.xml
     ...

我们如何使用pmd插件将它们添加到Gradle项目中?

我们必须处理以下材料/问题/答案:

  1. https://stackoverflow.com/search?page=2&tab=Relevance&q=pmd%20classpath
  2. ClassNotFoundException: Using custom java rule for PMD ruleset
  3. Gradle's PMD plugin: what are acceptable arguments?
  4. Adding a ruleset to PMD?
  5. Adding custom rules in PMD - class not found issue
  6. https://discuss.gradle.org/t/pmd-ruleset-not-available-in-classpath/7201
  7. https://discuss.gradle.org/t/custom-rules-with-pmd-plugin/5859/4
  8. How to configure PMD Auxiliary classpath in Sonar
  9. https://docs.gradle.org/current/userguide/pmd_plugin.html
  10. https://github.com/gradle/gradle/blob/master/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/PmdPlugin.java
  11. Custom PMD rule with Gradle also don't work
    tasks.withType(Pmd) {
       pmdClasspath += file("path/to/rules.jar")
    }
    

共有1个答案

卢锋
2023-03-14

在Gradle pmd插件的官方文档中,有一个依赖性部分,在没有实际示例的情况下从高层解释了这一方面:

  1. pmd - 要使用的 PMD 库
  2. pmdAux - 在分析期间可用于类型解析的附加库。如果 PMD 抱怨缺少类,这可能很有用。

为了将自定义java规则添加到项目中

>

  • 使用Gradle插件

    apply plugin: 'pmd'
    
    repositories {
       mavenCentral() // if your rules in Maven Central
       mavenLocal()   // if your rules is in .m2 folder 
       maven {
          // if your rules are in some custom/self-hosted artifacts repository like Nexus
       }
    }
    
    dependencies {
       ...
       pmd "io.github.abc:my-pmd-rules:0.1.0" 
       pmd "commons-io:commons-io:2.11.0"     // required dependency by pmd engine
       ...
    }
    
    pmd {
       consoleOutput = true
       ruleSetFiles = files("io/github/rules/our-rules.xml")    // exactly path as in your lib classpath
       ruleSets = []                                            // Keep it as is, workaround for pmd
    }
    

    使用Maven插件

    ...
    <build>
     <plugins>
       ...
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-pmd-plugin</artifactId>
         <version>3.15.0</version>
         <executions>
           <execution>
             <phase>test</phase>
             <goals>
               <goal>check</goal>
             </goals>
           </execution>
         </executions>
         <configuration>
           <printFailingErrors>true</printFailingErrors>
           <rulesets>
             ...
             <ruleset>io/github/rules/our-rules.xml</ruleset> <!-- exactly path as in your lib classpath -->
             ...
           </rulesets>
           <excludeRoots>
             <excludeRoot>target/generated-sources/</excludeRoot>
           </excludeRoots>
         </configuration>
         <dependencies>
           <!-- your custom rules -->
           <dependency>
             <groupId>io.github.abc</groupId>
             <artifactId>my-pmd-rules</artifactId>
             <version>0.1.0</version>
           </dependency>
         </dependencies>
       </plugin>
       ...
     </plugins>
    </build>
     ...
    

    如果您已经有一个规则集,并且只想包含自定义 Java 规则(来自库),则可以按原样直接在规则集 xml 中定义它:

      <!-- Define a rule -->
      <rule name="TheRuleName"
            language="java"
            externalInfoUrl="https://link.to.your.rule.official.docs.com"
            message="The violation message regarding your rule"
            class="io.github.rules.MissingMandatoryAnnotation">
        <priority>3</priority>
        <properties>
           ...
        </properties>
      </rule>
    

  •  类似资料:
    • 问题内容: 我的公司最近写了gradle插件来进行原始配置(存储库,项目间的通用依赖关系等)。总体而言,这大大简化了我们的构建过程,并发现了项目之间的一些不一致之处。我们最近尝试向插件添加任务,但该任务无法正常工作。 这是坏掉的插件: 除了之外,此插件都很好用。当我将其添加到混合中(并编译/部署到我们的本地仓库)时,当我尝试构建使用插件的项目时出现此错误: 问题答案: 在脚本中定义任务时,将调用方

    • 我无法在gradle项目中添加自定义源代码集。如何初始化这里的版本号?我的gradle文件看起来像:

    • 我想从maven转到gradle。 在pom中。xml文件我有一个自定义存储库: 它是一个简单的超文本传输协议Web服务器,带有. jar文件。 如何将此自定义回购添加到生成中。格拉德尔? 我尝试了此代码,但不起作用: 我的定制repo不是maven repo,但我在Gradle文档中没有找到可以指定URL的其他示例。

    • 我正在尝试用Java编写自定义PMD规则。我创建了一个自定义规则集,如下所示: 我调用使用这个Java类: 不幸的是,找不到我用Java编写的自定义规则;这是来自PmdStarter的消息: 找不到mwe的班级。习惯规则 这是我的(最小)自定义规则: 这是我在Eclipse中的项目结构: 我在这里读到,这种错误似乎是类路径错误。读完这篇文章后,我把放在项目中的几个目录中,希望PMD能找到它。 我的

    • 问题内容: 我收到此错误 %gradle build [ant:javac] Hello.java:2:错误:包javax.persistence不存在Hello.java:2:导入javax.persistence。*; 我应该添加到gradle.build包括什么 /opt/glassfish3/glassfish/modules/javax.persistence.jar 谢谢 问题答案:

    • 从这篇文章(向IntelliJ项目添加Gradle支持的最佳方式)中,我可以看到我需要做的是“在项目的根目录中添加build.Gradle” 我希望有人能解释一下我是怎么用intelliJ做的?(一直在搜索和阅读——仍然困惑不解)。 我理解一个根目录文件夹是所有项目源的父文件夹,但在intelliJ的标准JavaFX项目中,它是什么/我如何找到它/分配它,然后我如何添加build.gradle?