0

私はかなり奇妙な行動をしています。

pmd-extensions.xml という名前のファイルに PMD 4.2.6 の XPath ルールを作成します。

...
<rule name="AvoidPrintStackTrace-XPath"
  message="Avoid to use printStackTrace - XPath"
  class="net.sourceforge.pmd.rules.XPathRule">
  <description>Avoid to use printStackTrace - XPath</description>
  <properties>
    <property name="xpath">
     <value>
<![CDATA[
//Name[contains (@Image, "printStackTrace")]
]]>
     </value>
    </property>
  </properties>
  <example>
  <![CDATA[
    // don't do this! 
    myException.printStackTrace() 
   ]]>
   </example>
</rule>
...

このルールを検証し、正常に動作する単体テストがあります。

 ...
 @Before
 public void setUp() {
     addRule("rulesets/pmd-extensions.xml", "AvoidPrintStackTrace-XPath");
 }
 ...

しかし、このルールを Sonar に埋め込むと、期待していた違反が発生しません。

 ...
 <rule key="AvoidPrintStackStrace-XPath" >
  <name>AvoidPrintStackStrace-XPath</name>
  <configKey>rulesets/pmd-extensions.xml/AvoidPrintStackTrace-XPath</configKey>
  <category name="Usability"/>
  <description>Avoid to use printStackTrace - XPath</description>
 </rule>
 ...

このルールを Sonar で (同じ XPath 式で) 直接宣言すると、ルールは期待どおりに違反を発生させます。

...
<rule key="AvoidPrintStackStrace-XPath-Sonar" priority="MAJOR">
 <name><![CDATA[AvoidPrintStackStrace-XPath-Sonar]]></name>
 <configKey><![CDATA[net.sourceforge.pmd.rules.XPathRule]]></configKey>
 <category name="Maintainability"/>
 <description>Avoid to use printStackTrace - XPath-Sonar</description>
 <param key="xpath" type="s">
  <description><![CDATA[XPath expressions.]]></description>
  <defaultValue>//Name[contains (@Image, "printStackTrace")]</defaultValue>
 </param>
 <param key="message" type="s">
  <description><![CDATA[Message to display when a violation occurs.]]></description>
  <defaultValue>Prevent use of printStackTrace</defaultValue>
 </param>
</rule>
...

どうしたの ?

ありがとう。

4

1 に答える 1

1

プロジェクトで使用しているプロファイルに、この新しいルールを追加していない可能性があります。

「pmd-extensions.xml」ファイルを提供したという事実は、このルールをルール リポジトリに追加したことを意味します。ただし、このルールを 1 つのプロファイルでアクティブにしないと、非アクティブのままになり、実行されることはありません。

于 2012-06-27T07:56:40.873 に答える