我需要一種在Sonar上使用的驗證,它應該查看XHTML頁面中的JSF元素,驗證輸入元素是否包含ID屬性。 (例如:)在PMD中使用JSP自定義規則
最初我試圖用PMD來做。 正如我所見,PMD可以解釋JSP頁面。這是對的嗎? 實現它的方法是實現基於AbstractJspRule的自定義規則。
到目前爲止,PMD試圖將XHTML頁面解析爲Java代碼的問題。它應該解釋爲JSP頁面。
我的代碼:
類:
public class TestXhtmlRule extends AbstractJspRule {
@Override
public Object visit(final ASTElement node, final Object data) {
// ...
}
@Override
public Object visit(final ASTAttribute node, final Object data) {
// ...
}
}
XML:
[pmd] net.sourceforge.pmd.lang.java.ast.ParseException: Encountered " "<" "< "" at line 1, column 1.
Was expecting one of:
<EOF>
"abstract" ...
"class" ...
"final" ...
"import" ...
"interface" ...
"native" ...
"private" ...
"protected" ...
"public" ...
"static" ...
"synchronized" ...
"transient" ...
"volatile" ...
"strictfp" ...
<IDENTIFIER> ...
";" ...
"@" ...
"\u001a" ...
"~[]" ...
"@" ...
"@" ...
"@" ...
at net.sourceforge.pmd.lang.java.ast.JavaParser.generateParseException(JavaParser.java:9867)
at net.sourceforge.pmd.lang.java.ast.JavaParser.jj_consume_token(JavaParser.java:9751)
at net.sourceforge.pmd.lang.java.ast.JavaParser.CompilationUnit(JavaParser.java:190)
at net.sourceforge.pmd.lang.java.AbstractJavaParser.parse(AbstractJavaParser.java:56)
at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90)
at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:42)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:75)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:22)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
我怎樣才能使它發揮作用:
<ruleset name="Basic JSF rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<include-pattern>**/*.xhtml</include-pattern>
<rule name="idsJSF" language="jsp"
message="..."
class="pmd.rule.TestXhtmlRule">
<description>
...
</description>
<priority>3</priority>
<example>
<![CDATA[
<h:inputText id="itNome" label="Nome" value="#{pessoaBean.nome}" />;
]]>
</example>
</rule>
</ruleset>
從日誌中的錯誤?
用checkstyle而不是PMD驗證此規則會更容易嗎?
謝謝。
Humm,你可能是對的。我錯過了'-jsp'。現在我將試着找出如何在Ant中使用這個參數。我忘了在問題中指定,但我正在使用Ant PMD任務來運行它。謝謝。 –
我沒有看到用Ant任務執行此操作的方法。但是,您可以使用Ant exec任務將PMD作爲命令行運行。然後,您將參數作爲命令行傳遞,不需要自定義支持。 –
我還沒有運行它,但我不得不離開它,並在其他需求上工作。所以我會接受這個答案,因爲我認爲這是要走的路。 –