添加到PMD Gradle类路径中的第三方jar导致“java.lang.ClassNotFoundException:net.源文件伪造.pmd.PMD'

tez616oj  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(153)
    • bounty将在4天后过期**。回答此问题可获得+50的声望奖励。Swapnil Kotwal正在寻找规范答案

我尝试在gradle.properties中添加第三方依赖项,如下所示

dependencies {
    pmd fileTree(dir: "${lib}/aspectj-1.9.4", includes: ['*.jar'])
     
    // OR below
   
    // pmd 'org.aspectj:aspectjtools:1.9.4'

    // OR even below also causes same problem.

    // pmdAux 'org.aspectj:aspectjtools:1.9.4'
}

它导致错误java.lang.ClassNotFoundException: net.sourceforge.pmd.PMD,这里会出现什么问题?如何克服?
参考:

  1. https://stackoverflow.com/a/17179486/1665592
  2. https://stackoverflow.com/a/71147569/1665592
dced5bon

dced5bon1#

在手动配置依赖项(如示例所示)后,配置pmd中的所有依赖项似乎都被替换了。
https://stackoverflow.com/a/71147569/1169968中解释了Gradle pmd插件添加了两个依赖项配置:pmdpmdAux
pmd定义用于运行PMD的类路径。默认情况下,它由插件自动设置,具体取决于toolVersion属性(请参阅PmdPlugin.java#L194-L201和PmdPlugin.java#L145-L152)。有关Declaring Dependencies的Gradle文档解释说,“许多Gradle插件会将预定义的配置添加到您的项目中”。pmd是默认配置,由www.example.com注册/创建AbstractCodeQualityPlugin.java#L98-L116。配置名称为getToolName().toLowerCase()-因此所有代码质量插件都定义了与自身同名的配置。
当现在声明一个依赖关系时,以前配置的依赖关系似乎被删除了-换句话说:则替换该配置。
我不知道这是正确的行为还是一个bug。但似乎,一旦您开始手动声明此类工具依赖项,您就接管了为PMD声明完整类路径的责任。这是有道理的,因为“全部真相”都在build.gradle/gradle.properties文件中。然而,由于插件还具有toolVersion属性,因此此行为令人惊讶:手动声明依赖项后,toolVersion属性将被忽略。
要解决这个问题,您只需要额外声明pmd依赖项。

dependencies {
    // first define the main PMD dependency
    pmd 'net.sourceforge.pmd:pmd-java:6.54.0'

    // then declare additional dependencies, e.g. to include your custom rule
    pmd 'com.example:myrule:1.0.0'
    // or
    pmd fileTree(dir: "${lib}/aspectj-1.9.4", includes: ['*.jar'])
    // OR below
    // pmd 'org.aspectj:aspectjtools:1.9.4'
}

那么使用toolVersion就不起作用了,要使用不同的PMD版本,只需更新依赖项中的版本即可。
顺便说一句,我无法重现pmdAux的问题-如果将依赖项添加到pmdAux,PMD将执行。但是,它可能无法正确运行,因为可能会发生相同的情况:自动计算的辅助类路径将被丢弃,而只使用您声明的依赖项。这可能会导致由于类型解析无法正确工作而导致误报/漏报。

相关问题