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!
精彩评论