animal-sniffer
animal-sniffer copied to clipboard
ClassCastException: Cannot merger
When creating a signature, if you have two classes with the same name (e.g. in two different jars), the build-signatures
rule fails with an error like the following:
build.xml:29: java.lang.ClassCastException: Cannot merger class javax/xml/xpath/XPathFactoryFinder$1 as it has changed superclass: at org.codehaus.mojo.animal_sniffer.Clazz.<init>(Clazz.java:94) at org.codehaus.mojo.animal_sniffer.SignatureBuilder$SignatureVisitor.end(SignatureBuilder.java:222) at org.codehaus.mojo.animal_sniffer.SignatureBuilder.process(SignatureBuilder.java:194) at org.codehaus.mojo.animal_sniffer.ClassFileVisitor.processJarFile(ClassFileVisitor.java:153) at org.codehaus.mojo.animal_sniffer.ClassFileVisitor.process(ClassFileVisitor.java:105) at org.codehaus.mojo.animal_sniffer.ant.BuildSignaturesTask.process(BuildSignaturesTask.java:173) at org.codehaus.mojo.animal_sniffer.ant.BuildSignaturesTask.execute(BuildSignaturesTask.java:157) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293) at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:435) at org.apache.tools.ant.Target.performTasks(Target.java:456) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405) at org.apache.tools.ant.Project.executeTarget(Project.java:1376) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1260) at org.apache.tools.ant.Main.runBuild(Main.java:854) at org.apache.tools.ant.Main.startAnt(Main.java:236) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112)
I tried to work around this by excluding all anonymous classes, but it looks like excludes aren't processed until the very end.
- This error probably shouldn't be fatal.
- I'm not convinced the error even makes sense. I don't think the superclass actually changed. As far as I can tell, both versions extend Object.
- Excludes should, perhaps, be checked earlier.
- All anonymous classes should probably be excluded by default, too. They can't reasonably be part of an API,