2
<?xml version="1.0" encoding="UTF-8"?>
<project name="Example" default="pmd" basedir=".">
<property name="PMD.home" location="D:\Software\Java\pmd-4.2.5"/>
<path id="PMD.lib"> 
    <fileset dir="${PMD.home}\lib"> 
            <include name="*.jar" /> 
    </fileset> 
    <!--pathelement location="${PMD.home}/lib/jaxen-1.1.1.jar" -->
</path> 
<echo>${PMD.home}\lib</echo>
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" > 
    <classpath refid="PMD.lib" /> 
</taskdef> 
<target name="pmd">
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="PMD.lib"    />       
<echo>${PMD.home}\bin\pmd-rules.xml</echo>
<pmd> 
<ruleset>${PMD.home}\bin\pmd-rules.xml</ruleset>
<formatter type="html" toFile="pmd_report_ant9.html"  />
<fileset dir="C:\Documents and Settings\twarsi\eclipse3_5\tw1\Example">
<include name="**\*.java"/>
 </fileset>
 </pmd>
</target>
</project>

上記のAntスクリプトを実行してPMDルールセットpmd-rules.xmlを実行しようとしていますが、以下のエラーが発生します。

 pmd:
 [echo] D:\Software\Java\pmd-4.2.5\bin\pmd-rules.xml
  [pmd] Using the normal ClassLoader
  [pmd] Adding classpath entry: <D:\Software\Java\pmd-4.2.5\bin>
  [pmd] Sending a report to file = D:\Software\Java\pmd-4.2.5\bin\pmd_report
  _ant9.html; renderer = html

 BUILD FAILED
 java.lang.NoClassDefFoundError: org/jaxen/JaxenException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    at java.lang.Class.getConstructor0(Class.java:2699)
    at java.lang.Class.newInstance0(Class.java:326)
    at java.lang.Class.newInstance(Class.java:308)
    at net.sourceforge.pmd.RuleSetFactory.parseSingleRuleNode(RuleSetFactory
  .java:309)
    at net.sourceforge.pmd.RuleSetFactory.parseRuleNode(RuleSetFactory.java:
 253)
    at net.sourceforge.pmd.RuleSetFactory.parseRuleSetNode(RuleSetFactory.ja
 va:209)
    at net.sourceforge.pmd.RuleSetFactory.createSingleRuleSet(RuleSetFactory
.java:135)
    at net.sourceforge.pmd.RuleSetFactory.createRuleSets(RuleSetFactory.java
:85)
    at net.sourceforge.pmd.ant.PMDTask.doTask(PMDTask.java:220)
    at net.sourceforge.pmd.ant.PMDTask.execute(PMDTask.java:334)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
 java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.jav
a:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExe
cutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    at org.apache.tools.ant.Main.runBuild(Main.java:758)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

足りないものを教えてください。jaxen-1.1.1.jarもlibディレクトリにありますが、エラーが表示されています。antスクリプトに何かがありません。

4

4 に答える 4

1

pmd.home\lib内のすべてのファイルをant.home\libフォルダーにコピーします。

pmd.home は pmd ディレクトリです: あなたの場合: D:\Software\Java\pmd-4.2.5 ant.home はあなたの ant ホーム ディレクトリです: netbeans を使用していると仮定すると、netbeans\java\antになります。

jar の重複やバージョンの重複 (特に ant) に注意してください。

その後、再度コマンドを実行してください。それが役立つことを願っています。

于 2013-04-10T06:21:07.733 に答える
1

pmd 5.0.3 では、これでうまくいきます。

<property name="pmd.dir" value="${otherSoftware}/pmd-5.0.3" />
<path id="pmd.classpath">
    <fileset dir="${pmd.dir}\lib"> 
        <include name="*.jar" /> 
    </fileset>
</path>
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" />
<taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.classpath" />

注: pmd-5.0.3/lib には jaxen.jar が含まれています。

于 2013-04-29T07:27:58.010 に答える
0

に変更<!--pathelement location="${PMD.home}/lib/jaxen-1.1.1.jar" -->する<pathelement location="${PMD.home}/lib/jaxen-1.1.1.jar" />とうまくいくと思いますか?または、すべてのライブラリがすでにロードされていますか?試してみてくださいant -verbose

于 2011-09-20T18:57:12.287 に答える
0

バージョン4.2.6でもまったく同じ問題がありました。jaxen JAR ファイルが、ant が PMD 固有の JAR ファイルを探すディレクトリにあることが重要なようです。私にとっては、すべて (4 つ) の PMD jar ファイルが ${pmd.home} にある次のように動作します。

<property name="pmd.home" value="../../external/pmd" />
<target name="pmd">
    <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpath="${pmd.home}/pmd-4.2.6.jar"/> 

    <pmd shortFilenames="true">
        <ruleset>basic</ruleset>
        <formatter type="xml" toFile="${report.dir}/pmd.xml"/>
        <fileset dir="${src.dir}">
            <include name="**/*.java"/>
        </fileset>
    </pmd>
</target>

お役に立てれば!

于 2011-09-22T15:25:04.713 に答える