1

从 PMD 5.0.3 更新到 5.0.5 后,尝试通过 ant 运行 CPD 时出现 NoClassDefFoundError。我看到 CPD 更改为使用 FilenameUtils,但这应该不是问题,因为我在任务的路径中有 commons-io.jar。

这是 Ant 目标(FilenameUtils 在 commons-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
4

2 回答 2

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 jar。不需要asm。

于 2013-11-29T16:27:53.213 回答
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
于 2014-01-13T15:49:13.900 回答