我试图通过运行命令
在Windows中运行一个简单的Java程序pmd -d path-to-source\com\vaannila\domain\User.java -f text -R java-basic
和出现的错误如下。
线程“ main”中的异常java.lang.NoClassDefFoundError:C:\ pmd \ pmd-bin-5 / 4/6 \ bin // \\ lib \ asm-5 / 0/4 / jar 引起原因:java.lang.ClassNotFoundException:C:\ pmd \ pmd-bin-5.4.6 \ bin .. \ lib \ asm-5.0.4.jar 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202) 在java.security.AccessController.doPrivileged(本机方法) 在java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301) 在java.lang.ClassLoader.loadClass(ClassLoader.java:247) 找不到主类:C:\ pmd \ pmd-bin-5.4.6 \ bin .. \ lib \ asm-5.0.4.jar。程序将退出。
请帮助我运行PMD
答案 0 :(得分:0)
我无法重现您的问题,也无法完全理解错误消息。
根据错误消息,您已将PMD 5.4.6提取到C:\pmd
中,因此目录C:\pmd\pmd-bin-5.4.6
存在。在此目录中,有两个子目录:bin
-包含pmd.bat
和lib
,其中包含要放入类路径的必需jar。
因此,无需进一步配置系统,您就可以在命令外壳中简单地运行C:\pmd\pmd-5.4.6\bin\pmd.bat
-您应该看到帮助屏幕(而不是NoClassDefFound异常)。
您可以试试吗?那对你有用吗? 如果不是,请->重新安装PMD,因为您的安装似乎因某种原因被破坏了。
我知道,您仅使用pmd
来调用pmd-如果您当前位于目录C:\pmd\pmd-bin-5.4.6\bin
中,或者您将此目录添加到PATH
环境中,则此方法有效变量。即使我这样做,也不管我在哪个目录中,它都对我有用。
您是否配置了PATH
环境变量之类的内容?
我无法理解错误消息-它声称,它找不到名为“ C:\ pmd \ pmd-bin-5 / 4/6 \ bin // \ lib \ asm-5 / 0/4 / jar”。这不是一个类名,它看起来像一个受操纵的类路径-并且还查看正斜杠和后斜杠的混合。错误的下一部分是“ C:\ pmd \ pmd-bin-5.4.6 \ bin .. \ lib \ asm-5.0.4.jar”-虽然看起来是正确的,但缺少斜线-仍然没有意义。错误消息说,找不到主类-但是主类称为net.soureforge.pmd.PMD
。
作为参考,以下是pmd.bat
中的original content:
@echo off
set TOPDIR=%~dp0..
set OPTS=
set MAIN_CLASS=net.sourceforge.pmd.PMD
java -classpath %TOPDIR%\lib\* %OPTS% %MAIN_CLASS% %*
您可以将此与您的pmd.bat
进行比较吗?
我怀疑您的文件看起来有些不同。
您也可以在没有批处理文件的情况下运行PMD,例如:
java -classpath C:\pmd\pmd-bin-5.4.6\lib\* net.sourceforge.pmd.PMD -d path-to-source\com\vaannila\domain\User.java -f text -R java-basic
对您有用吗?
P.S .:的确,PMD 5.4.6是最后一个在Java 1.6上运行的PMD。但这并不意味着更新版本的PMD无法分析Java 1.6。码。您只需要最近的Java运行时(例如Java 10或11)即可执行PMD,并需要一个单独的JDK来构建您的项目。 PMD可以分析任何版本的Java,而不依赖于它运行的Java版本。