2013-08-21 31 views
1

从PMD 5.0.3更新到5.0.5之后,当尝试通过ant运行CPD时,出现NoClassDefFoundError错误。我发现CPD更改为使用FilenameUtils,但这不应该成为问题,因为我在任务的路径中使用了commons-io.jar。CPDTask对FilenameUtils有一个NoClassDefFoundError

这里是Ant目标(FilenameUtils是公地io.jar)

<target name="cpd" depends="init"> 
     <path id="pmd.cpd.classpath"> 
     <pathelement location="${3rdparty_libdir}/pmd.jar"/> 
     <pathelement location="${3rdparty_libdir}/asm.jar"/> 
     <pathelement location="${3rdparty_libdir}/commons-io.jar"/> 
     <pathelement location="${3rdparty_libdir}/jaxen.jar"/> 
     </path> 

     <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.cpd.classpath"/> 

     <cpd minimumTokenCount="${pmd.cpd.minimumTokenCount}" format="${pmd.cpd.format}" 
       outputFile="${pmd.cpd.outputFile}" encoding="${pmd.cpd.encoding}"> 
     <fileset dir="${srcdir}"> 
      <include name="**/*.java"/> 
     </fileset> 
     </cpd> 
    </target> 

我看不出有什么办法把classpathref在CPD通话。

以下是错误

java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils 
     at net.sourceforge.pmd.cpd.CPD.add(CPD.java:100) 
     at net.sourceforge.pmd.cpd.CPD.add(CPD.java:60) 
     at net.sourceforge.pmd.cpd.CPDTask.tokenizeFiles(CPDTask.java:119) 
     at net.sourceforge.pmd.cpd.CPDTask.execute(CPDTask.java:64) 
     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
     ... snip 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FilenameUtils 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 20 more 
+0

我发现了一个解决办法 - 公地io.jar添加到我的ANT_HOME/lib目录下。 – user2705080

回答

0

替换:

<path id="pmd.cpd.classpath"> 
    <pathelement location="${3rdparty_libdir}/pmd.jar"/> 
    <pathelement location="${3rdparty_libdir}/asm.jar"/> 
    <pathelement location="${3rdparty_libdir}/commons-io.jar"/> 
    <pathelement location="${3rdparty_libdir}/jaxen.jar"/> 
    </path> 

有了:

<path id="pmd.cpd.classpath"> 
     <fileset dir="${3rdparty_libdir}"> 
      <include name="**/*.jar" /> 
     </fileset> 
    </path> 

{} 3rdparty_libdir应该包含PMD,Jaxen的和commons-io的罐子。 Asm没有必要。

0

我设法让它的工作原理使用以下命令行:

java -Xmx512m -classpath ~/pmd-bin-5.0-2.5/lib/commons-io-2.2.jar:~/pmd-bin-5.0-2.5/lib/asm-3.2.jar:~/pmd-bin-5.0-2.5/lib/jaxen-1.1.1.jar:~/pmd-bin-5.0-2.5/lib/pmd-5.0.5.jar:~/ObjCLanguage-0.0.8-SNAPSHOT.jar net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files PATH_TO_XCODE_SOURCE --language ObjectiveC --encoding UTF-8 --format net.sourceforge.pmd.cpd.XMLRenderer