如何解决PMD中的‘Cannot load ruleset’与‘XPathRule’类错误?
PMD自定义规则集加载失败(XPathRule类加载错误)解决方案
执行PMD代码检查命令时,反复出现Cannot load ruleset及XPathRule类加载错误,错误指向customRuleset.xml的class属性,修改该属性值后问题仍未解决。
命令行错误信息
C:\Users\deniz\Desktop\OZU\CS401\dontUpdateA>pmd check -d src -R customRuleset.xml -f text [ERROR] Error at customRuleset.xml:11:11 9 | language="java" 10 | message="Message explaining the rule" 11 | class="net.sourceforge.pmd.lang.rule.XPathRule" ^^^^^ net.sourceforge.pmd.lang.rule.XPathRule 12 | <description>Rule description</description> 13 | <priority>3</priority>: net.sourceforge.pmd.lang.rule.XPathRule [ERROR] Cannot load ruleset customRuleset.xml: An XML validation error occurred [WARN] Progressbar rendering conflicts with reporting to STDOUT. No progressbar will be shown. Try running with argument -r <file> to output the report to a file instead.
自定义规则集XML代码
<?xml version="1.0"?> <ruleset name="CustomRuleset"> <description>This is a custom ruleset.</description> <rule name="CustomRuleExample" language="java" message="Message explaining the rule" class="net.sourceforge.pmd.lang.rule.XPathRule"> <description>Rule Description</description> <priority>3</priority> <properties> <property name="xpath"> <value> <![CDATA[ //VariableDeclaratorId[string-length(@Image) < 2] ]]> </value> </property> </properties> </rule> </ruleset>
解决方案
修正XPathRule类路径:
PMD版本迭代后,XPathRule的包路径发生了变化:- PMD 6.x及更早版本:
net.sourceforge.pmd.lang.rule.XPathRule - PMD 7.x版本:
net.sourceforge.pmd.lang.xpath.XPathRule
先执行pmd --version查看当前PMD版本,对应修改rule标签的class属性值。
- PMD 6.x及更早版本:
修复XML语法错误:
错误日志显示第13行存在多余内容,原代码中<priority>3</priority>后面的: net.sourceforge.pmd.lang.rule.XPathRule是无效内容,必须删除,确保XML格式完全合规。确认规则集文件路径:
执行PMD命令时,确保customRuleset.xml位于当前工作目录,或者使用绝对路径指定规则集(比如-R C:\xxx\customRuleset.xml)。
修改后的示例规则集(以PMD7为例)
<?xml version="1.0"?> <ruleset name="CustomRuleset"> <description>This is a custom ruleset.</description> <rule name="CustomRuleExample" language="java" message="Message explaining the rule" class="net.sourceforge.pmd.lang.xpath.XPathRule"> <description>Rule Description</description> <priority>3</priority> <properties> <property name="xpath"> <value> <![CDATA[ //VariableDeclaratorId[string-length(@Image) < 2] ]]> </value> </property> </properties> </rule> </ruleset>
内容的提问来源于stack exchange,提问作者Deniz Naz Altaş
相关产品推荐
相关产品推荐

