in src/main/org/apache/tools/ant/ComponentHelper.java [862:993]
public String diagnoseCreationFailure(String componentName, String type) {
StringWriter errorText = new StringWriter();
PrintWriter out = new PrintWriter(errorText);
out.println("Problem: failed to create " + type + " " + componentName);
//class of problem
boolean lowlevel = false;
boolean jars = false;
boolean definitions = false;
boolean antTask;
String home = System.getProperty(Launcher.USER_HOMEDIR);
File libDir = new File(home, Launcher.USER_LIBDIR);
String antHomeLib;
boolean probablyIDE = false;
String anthome = System.getProperty(MagicNames.ANT_HOME);
if (anthome != null) {
File antHomeLibDir = new File(anthome, "lib");
antHomeLib = antHomeLibDir.getAbsolutePath();
} else {
//running under an IDE that doesn't set ANT_HOME
probablyIDE = true;
antHomeLib = "ANT_HOME" + File.separatorChar + "lib";
}
StringBuilder dirListingText = new StringBuilder();
final String tab = " -";
dirListingText.append(tab);
dirListingText.append(antHomeLib);
dirListingText.append('\n');
if (probablyIDE) {
dirListingText.append(tab);
dirListingText.append("the IDE Ant configuration dialogs");
} else {
dirListingText.append(tab);
dirListingText.append(libDir);
dirListingText.append('\n');
dirListingText.append(tab);
dirListingText.append("a directory added on the command line with the -lib argument");
}
String dirListing = dirListingText.toString();
//look up the name
AntTypeDefinition def = getDefinition(componentName);
if (def == null) {
//not a known type
printUnknownDefinition(out, componentName, dirListing);
definitions = true;
} else {
//we are defined, so it is an instantiation problem
final String classname = def.getClassName();
antTask = classname.startsWith(MagicNames.ANT_CORE_PACKAGE + ".");
boolean optional = classname.startsWith(MagicNames.ANT_CORE_PACKAGE + ".types.optional")
|| classname.startsWith(MagicNames.ANT_CORE_PACKAGE + ".taskdefs.optional");
//start with instantiating the class.
Class<?> clazz = null;
try {
clazz = def.innerGetTypeClass();
} catch (ClassNotFoundException e) {
jars = true;
if (!optional) {
definitions = true;
}
printClassNotFound(out, classname, optional, dirListing);
} catch (NoClassDefFoundError ncdfe) {
jars = true;
printNotLoadDependentClass(out, optional, ncdfe, dirListing);
}
//here we successfully loaded the class or failed.
if (clazz != null) {
//success: proceed with more steps
try {
def.innerCreateAndSet(clazz, project);
//hey, there is nothing wrong with us
out.println("The component could be instantiated.");
} catch (NoSuchMethodException e) {
lowlevel = true;
out.println("Cause: The class " + classname
+ " has no compatible constructor.");
} catch (InstantiationException e) {
lowlevel = true;
out.println("Cause: The class " + classname
+ " is abstract and cannot be instantiated.");
} catch (IllegalAccessException e) {
lowlevel = true;
out.println("Cause: The constructor for " + classname
+ " is private and cannot be invoked.");
} catch (InvocationTargetException ex) {
lowlevel = true;
Throwable t = ex.getTargetException();
out.println("Cause: The constructor threw the exception");
out.println(t.toString());
t.printStackTrace(out); //NOSONAR
} catch (NoClassDefFoundError ncdfe) {
jars = true;
out.println("Cause: A class needed by class " + classname
+ " cannot be found: ");
out.println(" " + ncdfe.getMessage());
out.println("Action: Determine what extra JAR files are"
+ " needed, and place them in:");
out.println(dirListing);
}
}
out.println();
out.println("Do not panic, this is a common problem.");
if (definitions) {
out.println("It may just be a typographical error in the build file "
+ "or the task/type declaration.");
}
if (jars) {
out.println("The commonest cause is a missing JAR.");
}
if (lowlevel) {
out.println("This is quite a low level problem, which may need "
+ "consultation with the author of the task.");
if (antTask) {
out.println("This may be the Ant team. Please file a "
+ "defect or contact the developer team.");
} else {
out.println("This does not appear to be a task bundled with Ant.");
out.println("Please take it up with the supplier of the third-party " + type
+ ".");
out.println("If you have written it yourself, you probably have a bug to fix.");
}
} else {
out.println();
out.println("This is not a bug; it is a configuration problem");
}
}
out.flush();
out.close();
return errorText.toString();
}