Launcherpublic class Launcher extends Object This is a launcher for Ant. |
Fields Summary |
---|
public static final String | ANTHOME_PROPERTYThe Ant Home (installation) Directory property.
{@value} | public static final String | ANTLIBDIR_PROPERTYThe Ant Library Directory property.
{@value} | public static final String | ANT_PRIVATEDIRThe directory name of the per-user ant directory.
{@value} | public static final String | ANT_PRIVATELIBThe name of a per-user library directory.
{@value} | public static final String | USER_LIBDIRThe location of a per-user library directory.
It's value is the concatenation of {@link #ANT_PRIVATEDIR}
with {@link #ANT_PRIVATELIB}, with an appropriate file separator
in between. For example, on Unix, it's .ant/lib . | public static final String | MAIN_CLASSThe startup class that is to be run.
{@value} | public static final String | USER_HOMEDIRSystem property with user home directory.
{@value} | private static final String | JAVA_CLASS_PATHSystem property with application classpath.
{@value} | protected static final int | EXIT_CODE_ERRORExit code on trouble |
Methods Summary |
---|
private void | addPath(java.lang.String path, boolean getJars, java.util.List libPathURLs)Add a CLASSPATH or -lib to lib path urls.
StringTokenizer tokenizer = new StringTokenizer(path, File.pathSeparator);
while (tokenizer.hasMoreElements()) {
String elementName = tokenizer.nextToken();
File element = new File(elementName);
if (elementName.indexOf("%") != -1 && !element.exists()) {
continue;
}
if (getJars && element.isDirectory()) {
// add any jars in the directory
URL[] dirURLs = Locator.getLocationURLs(element);
for (int j = 0; j < dirURLs.length; ++j) {
libPathURLs.add(dirURLs[j]);
}
}
libPathURLs.add(Locator.fileToURL(element));
}
| private java.net.URL[] | getJarArray(java.net.URL[] libJars, java.net.URL[] userJars, java.net.URL[] systemJars, java.io.File toolsJar)Combine the various jar sources into a single array of jars.
int numJars = libJars.length + userJars.length + systemJars.length;
if (toolsJar != null) {
numJars++;
}
URL[] jars = new URL[numJars];
System.arraycopy(libJars, 0, jars, 0, libJars.length);
System.arraycopy(userJars, 0, jars, libJars.length, userJars.length);
System.arraycopy(systemJars, 0, jars, userJars.length + libJars.length,
systemJars.length);
if (toolsJar != null) {
jars[jars.length - 1] = Locator.fileToURL(toolsJar);
}
return jars;
| private java.net.URL[] | getLibPathURLs(java.lang.String cpString, java.util.List libPaths)Get the list of -lib enties and -cp entry into
a URL array.
List libPathURLs = new ArrayList();
if (cpString != null) {
addPath(cpString, false, libPathURLs);
}
for (Iterator i = libPaths.iterator(); i.hasNext();) {
String libPath = (String) i.next();
addPath(libPath, true, libPathURLs);
}
return (URL[]) libPathURLs.toArray(new URL[libPathURLs.size()]);
| private java.net.URL[] | getSystemURLs(java.io.File antLauncherDir)Get the jar files in ANT_HOME/lib.
determine ant library directory for system jars: use property
or default using location of ant-launcher.jar
File antLibDir = null;
String antLibDirProperty = System.getProperty(ANTLIBDIR_PROPERTY);
if (antLibDirProperty != null) {
antLibDir = new File(antLibDirProperty);
}
if ((antLibDir == null) || !antLibDir.exists()) {
antLibDir = antLauncherDir;
System.setProperty(ANTLIBDIR_PROPERTY, antLibDir.getAbsolutePath());
}
return Locator.getLocationURLs(antLibDir);
| private java.net.URL[] | getUserURLs()Get the jar files in user.home/.ant/lib
File userLibDir
= new File(System.getProperty(USER_HOMEDIR), USER_LIBDIR);
return Locator.getLocationURLs(userLibDir);
| public static void | main(java.lang.String[] args)Entry point for starting command line Ant.
int exitCode;
try {
Launcher launcher = new Launcher();
exitCode = launcher.run(args);
} catch (LaunchException e) {
exitCode = EXIT_CODE_ERROR;
System.err.println(e.getMessage());
} catch (Throwable t) {
exitCode = EXIT_CODE_ERROR;
t.printStackTrace(System.err);
}
if (exitCode != 0) {
System.exit(exitCode);
}
| private int | run(java.lang.String[] args)Run the launcher to launch Ant.
String antHomeProperty = System.getProperty(ANTHOME_PROPERTY);
File antHome = null;
File sourceJar = Locator.getClassSource(getClass());
File jarDir = sourceJar.getParentFile();
String mainClassname = MAIN_CLASS;
if (antHomeProperty != null) {
antHome = new File(antHomeProperty);
}
if (antHome == null || !antHome.exists()) {
antHome = jarDir.getParentFile();
System.setProperty(ANTHOME_PROPERTY, antHome.getAbsolutePath());
}
if (!antHome.exists()) {
throw new LaunchException("Ant home is set incorrectly or "
+ "ant could not be located");
}
List libPaths = new ArrayList();
String cpString = null;
List argList = new ArrayList();
String[] newArgs;
boolean noUserLib = false;
boolean noClassPath = false;
for (int i = 0; i < args.length; ++i) {
if (args[i].equals("-lib")) {
if (i == args.length - 1) {
throw new LaunchException("The -lib argument must "
+ "be followed by a library location");
}
libPaths.add(args[++i]);
} else if (args[i].equals("-cp")) {
if (i == args.length - 1) {
throw new LaunchException("The -cp argument must "
+ "be followed by a classpath expression");
}
if (cpString != null) {
throw new LaunchException("The -cp argument must "
+ "not be repeated");
}
cpString = args[++i];
} else if (args[i].equals("--nouserlib") || args[i].equals("-nouserlib")) {
noUserLib = true;
} else if (args[i].equals("--noclasspath") || args[i].equals("-noclasspath")) {
noClassPath = true;
} else if (args[i].equals("-main")) {
if (i == args.length - 1) {
throw new LaunchException("The -main argument must "
+ "be followed by a library location");
}
mainClassname = args[++i];
} else {
argList.add(args[i]);
}
}
//decide whether to copy the existing arg set, or
//build a new one from the list of all args excluding the special
//operations that only we handle
if (argList.size() == args.length) {
newArgs = args;
} else {
newArgs = (String[]) argList.toArray(new String[argList.size()]);
}
URL[] libURLs = getLibPathURLs(
noClassPath ? null : cpString, libPaths);
URL[] systemURLs = getSystemURLs(jarDir);
URL[] userURLs = noUserLib ? new URL[0] : getUserURLs();
URL[] jars = getJarArray(
libURLs, userURLs, systemURLs, Locator.getToolsJar());
// now update the class.path property
StringBuffer baseClassPath
= new StringBuffer(System.getProperty(JAVA_CLASS_PATH));
if (baseClassPath.charAt(baseClassPath.length() - 1)
== File.pathSeparatorChar) {
baseClassPath.setLength(baseClassPath.length() - 1);
}
for (int i = 0; i < jars.length; ++i) {
baseClassPath.append(File.pathSeparatorChar);
baseClassPath.append(Locator.fromURI(jars[i].toString()));
}
System.setProperty(JAVA_CLASS_PATH, baseClassPath.toString());
URLClassLoader loader = new URLClassLoader(jars);
Thread.currentThread().setContextClassLoader(loader);
Class mainClass = null;
int exitCode = 0;
try {
mainClass = loader.loadClass(mainClassname);
AntMain main = (AntMain) mainClass.newInstance();
main.startAnt(newArgs, null, null);
} catch (InstantiationException ex) {
System.err.println(
"Incompatible version of " + mainClassname + " detected");
File mainJar = Locator.getClassSource(mainClass);
System.err.println(
"Location of this class " + mainJar);
exitCode = EXIT_CODE_ERROR;
} catch (Throwable t) {
t.printStackTrace(System.err);
exitCode = EXIT_CODE_ERROR;
}
return exitCode;
|
|