开发者

Pmd ant script gives java.lang.NoClassDefFoundError: org/jaxen/JaxenException

<?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>

The above ant script i am trying to run to execute PMD ruleset pmd-rules.xml but i am getting the below error.

 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开发者_如何学JAVA(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)

Can you please let me know what i have missing . Even jaxen-1.1.1.jar is there in lib directory.But it is showing error.Am i missing something in ant script.


Copy all the files in your pmd.home\lib to ant.home\lib folder

pmd.home is your pmd directory:In your case: D:\Software\Java\pmd-4.2.5 ant.home is your ant home directory: Assuming you are using netbeans, it will be netbeans\java\ant

Watch out for duplicate jars or duplicate versions(especially ant).

And then, run the command again. Hope that helps.


In pmd 5.0.3, this works for me:

<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" />

Note: pmd-5.0.3/lib contains the jaxen.jar!


I guess changing <!--pathelement location="${PMD.home}/lib/jaxen-1.1.1.jar" --> to <pathelement location="${PMD.home}/lib/jaxen-1.1.1.jar" /> will do the trick? Or are all your libs already loaded? Please try ant -verbose.


I had the exact same issues, with version 4.2.6. It appears to be important that the jaxen JAR file is in the directory where ant looks for the PMD specific JAR files. For me the following works, where all (four) PMD jar files are located in ${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>

Hope this helps!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜