Community
Participate
Working Groups
build 20020821 branch 2.0.1 If the user wants to use a logger other than the default the command line -logger <loggerClassName> can be used. It seems to work fine if you create a logger and add its JAR to the Ant classpath but trying to use the org.apache.tools.ant.XmlLogger (available in the ant.jar) gives a dialog "Build Failed." with no more explanation about the problem. The user has no clue of what is wrong.
The same happens in 2.1.0 M1 build when calling antRunner from command line ("eclipse -application org.eclipse.core.antRunner -logger ....") [exec] java.lang.reflect.InvocationTargetException: java.lang.ClassCastException: org.apache.tools.ant.XmlLogger [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.addBuildListeners (InternalAntRunner.java:176) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:279) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:443) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.ant.core.AntRunner.run(AntRunner.java:338) [exec] at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:775) [exec] at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.core.launcher.Main.basicRun(Main.java:247) [exec] at org.eclipse.core.launcher.Main.run(Main.java:703) [exec] at org.eclipse.core.launcher.Main.main(Main.java:539) [exec] --- Nested Exception --- [exec] java.lang.ClassCastException: org.apache.tools.ant.XmlLogger [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.createLogger (InternalAntRunner.java:474) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.addBuildListeners (InternalAntRunner.java:169) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:279) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:443) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.ant.core.AntRunner.run(AntRunner.java:338) [exec] at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:775) [exec] at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.core.launcher.Main.basicRun(Main.java:247) [exec] at org.eclipse.core.launcher.Main.run(Main.java:703) [exec] at org.eclipse.core.launcher.Main.main(Main.java:539) [exec] --- Nested Exception --- [exec] java.lang.ClassCastException: org.apache.tools.ant.XmlLogger [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.createLogger (InternalAntRunner.java:470) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.addBuildListeners (InternalAntRunner.java:169) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:279) [exec] at org.eclipse.ant.internal.core.ant.InternalAntRunner.run (InternalAntRunner.java:443) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.ant.core.AntRunner.run(AntRunner.java:338) [exec] at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:775) [exec] at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at org.eclipse.core.launcher.Main.basicRun(Main.java:247) [exec] at org.eclipse.core.launcher.Main.run(Main.java:703) [exec] at org.eclipse.core.launcher.Main.main(Main.java:539)
I found the following interesting method in the source of CruiseControl (cruisecontrol.sourceforge.net). It seems that there are two different implementations of "org.apache.tools.ant.XmlLogger" (Ant 1.4/1.5 ?!?) One is uses as "-logger" and one is used as "-listener". /** * Determine whether the org.apache.tools.ant.XmlLogger being * used implements the BuildLogger interface. Using the XmlLogger * as a BuildLogger rather than a BuildListener is a newer feature * and can reduce log file size dramatically. * * @return true if XmlLogger can be found and used as a BuildLogger. */ protected boolean isLoggerSupported() { try { Class[] interfaces = Class.forName ("org.apache.tools.ant.XmlLogger").getInterfaces(); for(int i=0; i<interfaces.length; i++) { log.debug(interfaces[i].getName()); } boolean isLoggerAssignableToXml = (Class.forName ("org.apache.tools.ant.BuildLogger").isAssignableFrom(Class.forName ("org.apache.tools.ant.XmlLogger"))); boolean isXmlAssignableToLogger = (Class.forName ("org.apache.tools.ant.XmlLogger").isAssignableFrom(Class.forName ("org.apache.tools.ant.BuildLogger"))); log.debug("" + isLoggerAssignableToXml); log.debug("" + isXmlAssignableToLogger); return (Class.forName ("org.apache.tools.ant.BuildLogger").isAssignableFrom(Class.forName ("org.apache.tools.ant.XmlLogger"))); } catch (ClassNotFoundException e) { log.error("Could not find Ant XmlLogger", e); return false; } }
The XmlLogger provided in org.apache.tools.ant is NOT a BuildLogger but a BuildListener in Ant 1.4.1. It should be added using -listener. Using Ant 1.5, the XmlLogger IS a BuildLogger. Thanks Gunnar. So our bug here is that we need a much better error message in these types of cases where we expect a certain type of class passed
For BuildListeners and BuildLoggers, the class cast error message is shown to the user to help diagnose and fix the problem.
Please verify (Jared).
Verified.