conor 2003/06/27 04:19:22 Modified: . build.xml src/main/org/apache/tools/ant Main.java Added: src/main/org/apache/tools/ant/launch AntMain.java Launcher.java Locator.java Log: New Launch facility. Separate jar now can be used to launch Ant which takes over some of the functionality traditionally found in the Ant launch scripts. Revision Changes Path 1.383 +76 -19 ant/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/ant/build.xml,v retrieving revision 1.382 retrieving revision 1.383 diff -u -w -u -r1.382 -r1.383 --- build.xml 9 Jun 2003 13:38:05 -0000 1.382 +++ build.xml 27 Jun 2003 11:19:22 -0000 1.383 @@ -18,12 +18,31 @@ <property environment="env"/> + <!-- + =================================================================== + Set the properties that control names and versions + =================================================================== + --> <property name="Name" value="Apache Ant"/> <property name="name" value="ant"/> <property name="version" value="1.6alpha"/> - <property name="manifest-version" value="1.5.9"/> + <property name="manifest-version" value="1.6"/> <property name="bootstrap.jar" value="ant-bootstrap.jar"/> + <property name="ant.package" value="org/apache/tools/ant"/> + <property name="optional.package" value="${ant.package}/taskdefs/optional"/> + <property name="optional.type.package" value="${ant.package}/types/optional"/> + <property name="apache.resolver.type.package" value="${ant.package}/types/resolver"/> + <property name="util.package" value="${ant.package}/util"/> + <property name="regexp.package" value="${util.package}/regexp"/> + + <property name="optional.jars.prefix" value="ant"/> + + <!-- + =================================================================== + Set the properties that control various build options + =================================================================== + --> <property name="debug" value="true"/> <property name="chmod.fail" value="true"/> <property name="chmod.maxparallel" value="250"/> @@ -33,6 +52,8 @@ <property name="junit.fork" value="false"/> <property name="junit.filtertrace" value="off"/> <property name="junit.summary" value="no"/> + <property name="test.haltonfailure" value="yes" /> + <property name="unfiltered.files" value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf"/> <!-- =================================================================== @@ -47,20 +68,8 @@ <property name="etc.dir" value="src/etc"/> <property name="tests.dir" value="src/testcases"/> <property name="tests.etc.dir" value="src/etc/testcases"/> - <property name="test.haltonfailure" value="yes" /> - - <property name="ant.package" value="org/apache/tools/ant"/> - <property name="optional.package" value="${ant.package}/taskdefs/optional"/> - <property name="optional.type.package" value="${ant.package}/types/optional"/> - <property name="apache.resolver.type.package" value="${ant.package}/types/resolver"/> - <property name="util.package" value="${ant.package}/util"/> - <property name="regexp.package" value="${util.package}/regexp"/> - <property name="manifest" value="src/etc/manifest"/> - <property name="unfiltered.files" value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf"/> - - <!-- =================================================================== Set the properties for the build area @@ -74,8 +83,12 @@ <property name="build.tests" value="${build.dir}/testcases"/> <property name="build.tests.javadocs" value="${build.dir}/javadocs.test/"/> <property name="manifest.tmp" value="${build.dir}/optional.manifest"/> - <property name="optional.jars.prefix" value="ant"/> + <!-- + =================================================================== + Set the paths used in the build + =================================================================== + --> <path id="classpath"> </path> @@ -90,6 +103,7 @@ <pathelement location="${tests.etc.dir}"/> <path refid="classpath"/> </path> + <!-- turn this path into a string which is passed to the tests --> <property name="tests-classpath.value" refid="tests-classpath"/> @@ -113,8 +127,6 @@ <property name="src.dist.docs" value="${src.dist.dir}/docs"/> <property name="src.dist.lib" value="${src.dist.dir}/lib"/> - - <!-- =================================================================== Set up selectors to be used by javac, junit and jar to exclude @@ -128,6 +140,7 @@ <filename name="${optional.package}/extension/**"/> </or> </selector> + <selector id="needs.jdk1.4+"> <or> <filename name="${regexp.package}/Jdk14Regexp*"/> @@ -142,9 +155,11 @@ <filename name="${optional.package}/Javah*"/> </or> </selector> + <selector id="needs.sun.uue"> <filename name="${ant.package}/taskdefs/email/UUMailer*"/> </selector> + <selector id="needs.sun.b64"> <or> <filename name="${optional.package}/splash/SplashTask*"/> @@ -161,27 +176,34 @@ <filename name="${ant.package}/types/XMLCatalogBuildFileTest*"/> </or> </selector> + <selector id="needs.xalan1"> <or> <filename name="${optional.package}/XalanLiaison*"/> <filename name="${optional.package}/junit/Xalan1Executor*"/> </or> </selector> + <selector id="needs.xalan2"> <filename name="${optional.package}/junit/Xalan2Executor*"/> </selector> + <selector id="needs.xslp"> <filename name="${optional.package}/XslpLiaison*"/> </selector> + <selector id="needs.apache.resolver"> <filename name="${apache.resolver.type.package}/**"/> </selector> + <selector id="needs.junit"> <filename name="${optional.package}/junit/**"/> </selector> + <selector id="needs.jakarta.regexp"> <filename name="${regexp.package}/JakartaRegexp*"/> </selector> + <selector id="needs.jakarta.oro"> <or> <filename name="${regexp.package}/JakartaOro*"/> @@ -189,6 +211,7 @@ <filename name="${optional.package}/metamata/MAudit*"/> </or> </selector> + <selector id="needs.jakarta.bcel"> <or> <filename name="${ant.package}/filters/util/JavaClassHelper*"/> @@ -196,12 +219,15 @@ <filename name="${optional.type.package}/depend/ClassFileSetTest*"/> </or> </selector> + <selector id="needs.jakarta.log4j"> <filename name="${ant.package}/listener/Log4jListener*"/> </selector> + <selector id="needs.commons.logging"> <filename name="${ant.package}/listener/CommonsLoggingListener*"/> </selector> + <selector id="needs.bsf"> <or> <filename name="${optional.package}/Script*"/> @@ -209,32 +235,40 @@ <filename name="${optional.type.package}/Script*"/> </or> </selector> + <selector id="needs.stylebook"> <filename name="${optional.package}/StyleBook*"/> </selector> + <selector id="needs.javamail"> <or> <filename name="${ant.package}/taskdefs/email/MimeMailer*"/> </or> </selector> + <selector id="needs.icontract"> <filename name="${optional.package}/IContract*"/> </selector> + <selector id="needs.netrexx"> <filename name="${optional.package}/NetRexxC*"/> </selector> + <selector id="needs.weblogic.ejbc"> <filename name="${optional.package}/ejb/Ejbc*"/> </selector> + <selector id="needs.weblogic.ddcreator"> <filename name="${optional.package}/ejb/DDCreator*"/> </selector> + <selector id="needs.weblogic.server"> <or> <filename name="${optional.package}/ejb/WLRun*"/> <filename name="${optional.package}/ejb/WLStop*"/> </or> </selector> + <selector id="needs.commons.net"> <or> <filename name="${optional.package}/net/FTP*"/> @@ -242,40 +276,54 @@ <filename name="${optional.package}/net/TelnetTask*"/> </or> </selector> + <selector id="needs.starteam"> <or> <filename name="${optional.package}/scm/AntStarTeam*"/> <filename name="${optional.package}/starteam/*"/> </or> </selector> + <selector id="needs.vaj"> <filename name="${optional.package}/ide/VAJ*"/> </selector> + <selector id="needs.antlr"> <filename name="${optional.package}/ANTLR*"/> </selector> + <selector id="needs.jmf"> <filename name="${optional.package}/sound/*"/> </selector> + <selector id="needs.jai"> <or> <filename name="${optional.package}/image/*"/> <filename name="${ant.package}/types/optional/image/*"/> </or> </selector> + <selector id="needs.jdepend"> <filename name="${optional.package}/jdepend/*"/> </selector> + <selector id="needs.swing"> <filename name="${optional.package}/splash/*"/> </selector> + <selector id="needs.jsch"> <filename name="${optional.package}/ssh/*"/> </selector> + + <selector id="ant.launcher"> + <filename name="${ant.package}/launch/**/*"/> + </selector> + <patternset id="onlinetests"> <exclude name="**/GetTest.java" if="offline"/> <exclude name="**/SignJarTest.java" if="offline"/> </patternset> + <patternset id="teststhatfail"> <exclude name="${optional.package}/BeanShellScriptTest.java"/> <exclude name="${ant.package}/taskdefs/ImportTest.java"/> @@ -617,12 +665,11 @@ <include name="junit-noframes.xsl"/> </fileset> </copy> - </target> <!-- =================================================================== - Create the Apache Ant jars: ant.jar and optional.jar + Create the all of the Apache Ant jars =================================================================== --> <target name="jars" @@ -659,6 +706,15 @@ </section> </manifest> + <jar destfile="${build.lib}/${name}-launcher.jar" + basedir="${build.classes}"> + <selector refid="ant.launcher"/> + <manifest> + <attribute name="Main-Class" value="org.apache.tools.ant.launch.Launcher"/> + <attribute name="Class-Path" value="xercesImpl.jar xml-apis.jar"/> + </manifest> + </jar> + <jar destfile="${build.lib}/${name}.jar" basedir="${build.classes}" manifest="${manifest}"> @@ -675,6 +731,7 @@ <selector refid="needs.jakarta.oro"/> <selector refid="needs.jdk1.4+"/> <selector refid="needs.javamail"/> + <selector refid="ant.launcher"/> </or> </selector> </not> 1.84 +50 -11 ant/src/main/org/apache/tools/ant/Main.java Index: Main.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Main.java,v retrieving revision 1.83 retrieving revision 1.84 diff -u -w -u -r1.83 -r1.84 --- Main.java 10 Jun 2003 13:29:55 -0000 1.83 +++ Main.java 27 Jun 2003 11:19:22 -0000 1.84 @@ -66,6 +66,8 @@ import org.apache.tools.ant.input.DefaultInputHandler; import org.apache.tools.ant.input.InputHandler; import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.launch.AntMain; + /** * Command line entry point into Ant. This class is entered via the @@ -79,7 +81,7 @@ * * @author [EMAIL PROTECTED] */ -public class Main { +public class Main implements AntMain { /** The default build file name. */ public static final String DEFAULT_BUILD_FILENAME = "build.xml"; @@ -175,11 +177,25 @@ */ public static void start(String[] args, Properties additionalUserProperties, ClassLoader coreLoader) { - Main m = null; + Main m = new Main(); + m.startAnt(args, additionalUserProperties, coreLoader); + } + + /** + * Start Ant + * @param args command line args + * @param additionalUserProperties properties to set beyond those that + * may be specified on the args list + * @param coreLoader - not used + * + * @since Ant 1.6 + */ + public void startAnt(String[] args, Properties additionalUserProperties, + ClassLoader coreLoader) { try { Diagnostics.validateVersion(); - m = new Main(args); + processArgs(args); } catch (Throwable exc) { handleLogfile(); printMessage(exc); @@ -191,17 +207,17 @@ e.hasMoreElements();) { String key = (String) e.nextElement(); String property = additionalUserProperties.getProperty(key); - m.definedProps.put(key, property); + definedProps.put(key, property); } } // expect the worst int exitCode = 1; try { - m.runBuild(coreLoader); + runBuild(coreLoader); exitCode = 0; } catch (BuildException be) { - if (m.err != System.err) { + if (err != System.err) { printMessage(be); } } catch (Throwable exc) { @@ -249,6 +265,13 @@ } /** + * Constructor used when creating Main for later arg processing + * and startup + */ + public Main() { + } + + /** * Sole constructor, which parses and deals with command line * arguments. * @@ -258,6 +281,17 @@ * or is a directory. */ protected Main(String[] args) throws BuildException { + processArgs(args); + } + + /** + * Process command line arguments + * + * @param args the command line arguments. + * + * @since Ant 1.6 + */ + private void processArgs(String[] args) { String searchForThis = null; PrintStream logTo = null; @@ -670,6 +704,8 @@ /** * Creates the InputHandler and adds it to the project. * + * @param project the project instance. + * * @exception BuildException if a specified InputHandler * implementation could not be loaded. */ @@ -713,7 +749,8 @@ BuildLogger logger = null; if (loggerClassname != null) { try { - logger = (BuildLogger) (Class.forName(loggerClassname).newInstance()); + Class loggerClass = Class.forName(loggerClassname); + logger = (BuildLogger) (loggerClass.newInstance()); } catch (ClassCastException e) { System.err.println("The specified logger class " + loggerClassname @@ -918,6 +955,8 @@ * Writes a formatted list of target names to <code>System.out</code> * with an optional description. * + * + * @param project the project instance. * @param names The names to be printed. * Must not be <code>null</code>. * @param descriptions The associated target descriptions. 1.1 ant/src/main/org/apache/tools/ant/launch/AntMain.java Index: AntMain.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.launch; import java.util.Properties; /** * Interface used to bridge to the actual Main class without any * messy reflection * * @author Conor MacNeill * @since Ant 1.6 */ public interface AntMain { /** * Start Ant. * * @param args command line args * @param additionalUserProperties properties to set beyond those that * may be specified on the args list * @param coreLoader - not used * * @since Ant 1.6 */ void startAnt(String[] args, Properties additionalUserProperties, ClassLoader coreLoader); } 1.1 ant/src/main/org/apache/tools/ant/launch/Launcher.java Index: Launcher.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.launch; import java.net.URL; import java.net.URLClassLoader; import java.net.MalformedURLException; import java.io.File; /** * This is a launcher for Ant. * * @author Conor MacNeill * @since Ant 1.6 */ public class Launcher { /** The Ant Home property */ public static final String ANTHOME_PROPERTY = "ant.home"; /** The location of a per-user library directory */ public static final String USER_LIBDIR = ".ant/lib"; /** The startup class that is to be run */ public static final String MAIN_CLASS = "org.apache.tools.ant.Main"; /** * Entry point for starting command line Ant * * @param args commandline arguments */ public static void main(String[] args) { try { Launcher launcher = new Launcher(); launcher.run(args); } catch (Throwable t) { t.printStackTrace(); } } /** * Run the launcher to launch Ant * * @param args the command line arguments * * @exception MalformedURLException if the URLs required for the classloader * cannot be created. */ private void run(String[] args) throws MalformedURLException { String antHomeProperty = System.getProperty(ANTHOME_PROPERTY); File antHome = null; URL launchJarURL = Locator.getClassLocationURL(getClass()); File jarDir = new File(launchJarURL.getFile()).getParentFile(); if (antHomeProperty != null) { antHome = new File(antHomeProperty); } if (antHome == null || !antHome.exists()) { URL antHomeURL = new URL(launchJarURL, ".."); antHome = new File(antHomeURL.getFile()); System.setProperty(ANTHOME_PROPERTY, antHome.getAbsolutePath()); } if (!antHome.exists()) { throw new IllegalStateException("Ant home is set incorrectly or " + "ant could not be located"); } // Now try and find JAVA_HOME File toolsJar = Locator.getToolsJar(); URL[] systemJars = Locator.getLocationURLs(jarDir); File userLibDir = new File(System.getProperty("user.home"), USER_LIBDIR); URL[] userJars = Locator.getLocationURLs(userLibDir); int numJars = userJars.length + systemJars.length; if (toolsJar != null) { numJars++; } URL[] jars = new URL[numJars]; System.arraycopy(userJars, 0, jars, 0, userJars.length); System.arraycopy(systemJars, 0, jars, userJars.length, systemJars.length); if (toolsJar != null) { jars[jars.length - 1] = toolsJar.toURL(); } // now update the class.path property StringBuffer baseClassPath = new StringBuffer(System.getProperty("java.class.path")); for (int i = 0; i < jars.length; ++i) { baseClassPath.append(File.pathSeparatorChar); baseClassPath.append(jars[i].getFile()); } System.setProperty("java.class.path", baseClassPath.toString()); URLClassLoader loader = new URLClassLoader(jars); try { Class mainClass = loader.loadClass(MAIN_CLASS); AntMain main = (AntMain) mainClass.newInstance(); main.startAnt(args, null, null); } catch (Throwable t) { t.printStackTrace(); } } } 1.1 ant/src/main/org/apache/tools/ant/launch/Locator.java Index: Locator.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.launch; import java.net.MalformedURLException; import java.net.URL; import java.io.File; import java.io.FilenameFilter; /** * The Locator is a utility class which is used to find certain items * in the environment * * @author Conor MacNeill * @since Ant 1.6 */ public class Locator { /** * Get the URL for the given class's load location. * * @param theClass the class whose load URL is desired. * @return a URL which identifies the component from which this class * was loaded. * @throws MalformedURLException if the class' URL cannot be * constructed. */ public static URL getClassLocationURL(Class theClass) throws MalformedURLException { String className = theClass.getName().replace('.', '/') + ".class"; URL classRawURL = theClass.getClassLoader().getResource(className); String fileComponent = classRawURL.getFile(); if (classRawURL.getProtocol().equals("file")) { // Class comes from a directory of class files rather than // from a jar. int classFileIndex = fileComponent.lastIndexOf(className); if (classFileIndex != -1) { fileComponent = fileComponent.substring(0, classFileIndex); } return new URL("file:" + fileComponent); } else if (classRawURL.getProtocol().equals("jar")) { // Class is coming from a jar. The file component of the URL // is actually the URL of the jar file int classSeparatorIndex = fileComponent.lastIndexOf("!"); if (classSeparatorIndex != -1) { fileComponent = fileComponent.substring(0, classSeparatorIndex); } return new URL(fileComponent); } else { // its running out of something besides a jar. // We just return the Raw URL as a best guess return classRawURL; } } /** * Get the URL necessary to load the Sun compiler tools. If the classes * are available to this class, then no additional URL is required and * null is returned. This may be because the classes are explcitly in the * class path or provided by the JVM directly * * @return the tools jar as a File if required, null otherwise */ public static File getToolsJar() { // firstly check if the tols jar is alreayd n the classpath boolean toolsJarAvailable = false; try { // just check whether this throws an exception Class.forName("com.sun.tools.javac.Main"); toolsJarAvailable = true; } catch (Exception e) { try { Class.forName("sun.tools.javac.Main"); toolsJarAvailable = true; } catch (Exception e2) { // ignore } } if (toolsJarAvailable) { return null; } // couldn't find compiler - try to find tools.jar // based on java.home setting String javaHome = System.getProperty("java.home"); if (javaHome.endsWith("jre")) { javaHome = javaHome.substring(0, javaHome.length() - 4); } File toolsJar = new File(javaHome + "/lib/tools.jar"); if (!toolsJar.exists()) { System.out.println("Unable to locate tools.jar. " + "Expected to find it in " + toolsJar.getPath()); return null; } return toolsJar; } /** * Get an array or URLs representing all of the jar files in the * given location. If the location is a file, it is returned as the only * element of the array. If the location is a directory, it is scanned for * jar files * * @param location the location to scan for Jars * * @return an array of URLs for all jars in the given location. * * @exception MalformedURLException if the URLs for the jars cannot be * formed */ public static URL[] getLocationURLs(File location) throws MalformedURLException { return getLocationURLs(location, new String[]{".jar"}); } /** * Get an array or URLs representing all of the files of a given set of * extensions in the given location. If the location is a file, it is * returned as the only element of the array. If the location is a * directory, it is scanned for matching files * * @param location the location to scan for files * @param extensions an array of extension that are to match in the * directory search * * @return an array of URLs of matching files * @exception MalformedURLException if the URLs for the files cannot be * formed */ public static URL[] getLocationURLs(File location, final String[] extensions) throws MalformedURLException { URL[] urls = new URL[0]; if (!location.exists()) { return urls; } if (!location.isDirectory()) { urls = new URL[1]; String path = location.getPath(); for (int i = 0; i < extensions.length; ++i) { if (path.endsWith(extensions[i])) { urls[0] = location.toURL(); break; } } return urls; } File[] matches = location.listFiles( new FilenameFilter() { public boolean accept(File dir, String name) { for (int i = 0; i < extensions.length; ++i) { if (name.endsWith(extensions[i])) { return true; } } return false; } }); urls = new URL[matches.length]; for (int i = 0; i < matches.length; ++i) { urls[i] = matches[i].toURL(); } return urls; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]