- 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条答案
按热度按时间dced5bon1#
在手动配置依赖项(如示例所示)后,配置
pmd
中的所有依赖项似乎都被替换了。在https://stackoverflow.com/a/71147569/1169968中解释了Gradle pmd插件添加了两个依赖项配置:
pmd
和pmdAux
。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依赖项。
那么使用
toolVersion
就不起作用了,要使用不同的PMD版本,只需更新依赖项中的版本即可。顺便说一句,我无法重现
pmdAux
的问题-如果将依赖项添加到pmdAux,PMD将执行。但是,它可能无法正确运行,因为可能会发生相同的情况:自动计算的辅助类路径将被丢弃,而只使用您声明的依赖项。这可能会导致由于类型解析无法正确工作而导致误报/漏报。