animal-sniffer icon indicating copy to clipboard operation
animal-sniffer copied to clipboard

ClassCastException: Cannot merger

Open pburka opened this issue 7 years ago • 0 comments

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.

  1. This error probably shouldn't be fatal.
  2. 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.
  3. Excludes should, perhaps, be checked earlier.
  4. All anonymous classes should probably be excluded by default, too. They can't reasonably be part of an API,

pburka avatar Jun 09 '17 22:06 pburka