I've got Ant and Ivy setup so that I can use Ivy downloaded JARs to run PMD. Trying the same with FindBugs, setting the findbugs.home
Ant property to ivy-jars/findbugs
, where the Ivy JARs go. I initially got the error that it couldn't find the JAR files under the ${findbugs.home}/lib
directory. I fixed that by changing Ivy to download the JAR files into ivy-jars/findbugs/lib
. However, this gave rise to the new error:
Executing findbugs FindBugsTask from ant task
Running FindBugs...
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.bcel.classfile.ClassFormatException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
This turns out to be caused by three problems:
symlink="true"
. FindBugs dereferences the symlink tofindbugs.jar
and looks for all of its other JAR files under the same directory, but the way Ivy structures its cache only thefindbugs.jar
is in that directory. This can be fixed easily enough by not using symlinks.[artifact].[ext]
and sometimes have the format[artifact]-[revision].[ext]
, which can be solved by doing<ivy:retrieve>
two times with differentpattern
values.bcel-6.0-SNAPSHOT.jar
rather thanbcel-findbugs.jar
orbcel-findbugs-6.0.jar
; this can be fixed with a symbolic link.I consider this to just be a workaround, rather than a true solution, since #2 and #3 can't be how FindBugs is intended to be used under Ivy. So if anyone knows the right way to do it, please provide a better answer.