Return-Path: Mailing-List: contact ant-dev-help@jakarta.apache.org; run by ezmlm Delivered-To: mailing list ant-dev@jakarta.apache.org Received: (qmail 26843 invoked from network); 3 Aug 2000 00:49:37 -0000 Received: from unknown (HELO rainmaker.angami.com) (209.31.60.68) by locus.apache.org with SMTP; 3 Aug 2000 00:49:37 -0000 Received: from eng03 ([10.1.1.69]) by rainmaker.angami.com (8.9.3/8.9.3) with SMTP id RAA08792 for ; Wed, 2 Aug 2000 17:49:12 -0700 (PDT) From: "Mike McCune" To: Subject: RE: Jikes on Windows NT Date: Wed, 2 Aug 2000 17:49:08 -0700 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0013_01BFFCA9.F51F8760" X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2910.0) Importance: Normal In-Reply-To: <3988B537.67F5338B@fuzzymagic.com> X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-Spam-Rating: locus.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. ------=_NextPart_000_0013_01BFFCA9.F51F8760 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Attached is a patched version of the Javac.java file from the 3.1 release version. The only changes that I made were to the doJikesCompile() method. Mike -----Original Message----- From: Sean Brandt [mailto:sean@fuzzymagic.com] Sent: Wednesday, August 02, 2000 4:57 PM To: ant-dev@jakarta.apache.org Subject: Re: Jikes on Windows NT I'd love a copy of the patch. Thanks, Sean Mike McCune wrote: > I found that on my machines here if you tried to compile more than ~380 files jikes wouldn't do anything. I think this was some > limitation of the size of the command passed from exec() to jikes. > > I wrote a patch to the Javac task to split the list of files (if greater than 300) into smaller chunks and compile them in batches. > This may be the same approach that Matt Foemel did but it has been working for my team for almost 6 months now. I think we are > using the 3.1 release with my patch worked in. > > If anyone wants this patch that I wrote or any more info, let me know, > Mike > > -----Original Message----- > From: Michael jamison [mailto:mjamison@centrimed.com] > Sent: Wednesday, August 02, 2000 8:38 AM > To: 'ant-dev@jakarta.apache.org' > Subject: RE: Jikes on Windows NT > > Here's some output with the -verbose option > > Setting project property: java.specification.name -> Java Platform API > Specification > Setting project property: awt.toolkit -> sun.awt.windows.WToolkit > Setting project property: java.version -> 1.2.2 > Setting project property: java.awt.graphicsenv -> > sun.awt.Win32GraphicsEnvironment > Setting project property: user.timezone -> America/Denver > Setting project property: java.specification.version -> 1.2 > Setting project property: java.vm.vendor -> Sun Microsystems Inc. > Setting project property: java.vm.specification.version -> 1.0 > Setting project property: user.home -> C:\WINNT\Profiles\mjamison > Setting project property: os.arch -> x86 > Setting project property: java.awt.fonts -> > Setting project property: java.vendor.url -> http://java.sun.com/ > Setting project property: file.encoding.pkg -> sun.io > Setting project property: user.region -> US > Setting project property: java.home -> c:\jdk1.2.2\jre > Setting project property: java.class.path -> > c:\work\classes;c:\work\lib\ant.jar;c:\work\classes;c:\jdk1.2.2\lib\tools.ja > r;c:\work\lib\jaxp.jar;c:\work\lib\parser.jar;c:\work\lib\j2ee.jar > Setting project property: line.separator -> > > Setting project property: java.ext.dirs -> c:\jdk1.2.2\jre\lib\ext > Setting project property: java.io.tmpdir -> C:\TEMP\ > Setting project property: os.name -> Windows NT > Setting project property: java.vendor -> Sun Microsystems Inc. > Setting project property: java.awt.printerjob -> sun.awt.windows.WPrinterJob > Setting project property: java.library.path -> > c:\jdk1.2.2\bin;.;C:\WINNT\System32;C:\WINNT;D:\Oracle\Ora81\bin;C:\Program > Files\Oracle\jre\1.1.7\bin;C:\WINNT\system32;C:\WINNT;D:\Oracle\Ora81\bin;C: > \Program > Files\Oracle\jre\1.1.7\bin;C:\WINNT\system32;C:\WINNT;c:\vslick\win;c:\work\ > src\batchfiles;c:\program files\microsoft visual studio\vss\win32 > Setting project property: java.vm.specification.vendor -> Sun Microsystems > Inc. > Setting project property: sun.io.unicode.encoding -> UnicodeLittle > Setting project property: file.encoding -> Cp1252 > Setting project property: java.specification.vendor -> Sun Microsystems Inc. > Setting project property: user.name -> mjamison > Setting project property: user.language -> en > Setting project property: java.vendor.url.bug -> > http://java.sun.com/cgi-bin/bugreport.cgi > Setting project property: java.vm.name -> Classic VM > Setting project property: java.vm.specification.name -> Java Virtual Machine > Specification > Setting project property: java.class.version -> 46.0 > Setting project property: sun.boot.library.path -> c:\jdk1.2.2\jre\bin > Setting project property: os.version -> 4.0 > Setting project property: java.vm.info -> build JDK-1.2.2-001, native > threads, symcjit > Setting project property: java.vm.version -> 1.2.2 > Setting project property: java.compiler -> symcjit > Setting project property: path.separator -> ; > Setting project property: user.dir -> C:\work\batchfiles\windows > Setting project property: file.separator -> \ > Setting project property: sun.boot.class.path -> > c:\jdk1.2.2\jre\lib\rt.jar;c:\jdk1.2.2\jre\lib\i18n.jar;c:\jdk1.2.2\jre\clas > ses > Setting ro project property: ant.home -> c:\work\lib > Setting ro project property: basedir -> c:\work > Setting ro project property: ant.file -> c:\work\build\build.xml > Project base dir set to: C:\work > ... > > [javac] Compiling 44 source files to C:\work\classes > [javac] Using jikes compiler > [javac] Dropping from classpath: C:\work\lib\tools.jar > [javac] Dropping from classpath: C:\jdk1.2.2\jre\jre\lib\rt.jar > [javac] Compilation args: [-Xstdout, -d, C:\work\classes, -classpath, > C:\work\classes;C:\work\lib\j2ee.jar;C:\jdk1.2 > .2\jre\lib\rt.jar;C:\weblogic\lib\weblogicaux.jar;C:\weblogic\classes;C:\wor > k\lib\ant.jar;C:\jdk1.2.2\lib\tools.jar;C:\w > ork\lib\jaxp.jar;C:\work\lib\parser.jar;c:\work\src, -O] > [javac] Files to be compiled: > .. > > jikes.exe is in c:/winnt which is in java.library.path > > Mike > > -----Original Message----- > From: Stefan Bodewig [mailto:bodewig@bost.de] > Sent: Wednesday, August 02, 2000 9:14 AM > To: ant-dev@jakarta.apache.org > Subject: Re: Jikes on Windows NT > > >>>>> "Mj" == Michael jamison writes: > > Mj> Any suggestions would be greatly appreciated. > > apart from the obvious "ant -verbose" you've probably already tried? > > Hmm, how many files are you trying to compile? I've modified a patch > Matt Foemel had submitted to support a large number of files. Maybe > I've broken some functionality with this - me modifying the patch, not > commiting it? > > Stefan ------=_NextPart_000_0013_01BFFCA9.F51F8760 Content-Type: application/octet-stream; name="Javac.java" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="Javac.java" /* * The Apache Software License, Version 1.1 * * Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org. * * 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. * = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D * * 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 * . */ package org.apache.tools.ant.taskdefs; import org.apache.tools.ant.*; import java.io.*; import java.util.*; /** * Task to compile Java source files. This task can take the following * arguments: *
    *
  • sourcedir *
  • destdir *
  • deprecation *
  • classpath *
  • bootclasspath *
  • extdirs *
  • optimize *
  • debug *
  • target *
* Of these arguments, the sourcedir and destdir are = required. *

* When this task executes, it will recursively scan the sourcedir and * destdir looking for Java source files to compile. This task makes its * compile decision based on timestamp. Any other file in the * sourcedir will be copied to the destdir allowing support files to be * located properly in the classpath. * * @author James Davidson duncan@x180.com */ public class Javac extends MatchingTask { =20 private File srcDir; private File destDir; private String compileClasspath; private boolean debug =3D false; private boolean optimize =3D false; private boolean deprecation =3D false; private boolean filtering =3D false; private String target; private String bootclasspath; private String extdirs; protected Vector compileList =3D new Vector(); protected Hashtable filecopyList =3D new Hashtable(); /** * Set the source dir to find the source Java files. */ public void setSrcdir(String srcDirName) { srcDir =3D project.resolveFile(srcDirName); } /** * Set the destination directory into which the Java source * files should be compiled. */ public void setDestdir(String destDirName) { destDir =3D project.resolveFile(destDirName); } /** * Set the classpath to be used for this compilation. */ public void setClasspath(String classpath) { compileClasspath =3D project.translatePath(classpath); } /** * Sets the bootclasspath that will be used to compile the classes * against. */ public void setBootclasspath(String bootclasspath) { this.bootclasspath =3D project.translatePath(bootclasspath); } /** * Sets the extension directories that will be used during the * compilation. */ public void setExtdirs(String extdirs) { this.extdirs =3D project.translatePath(extdirs); } /** * Set the deprecation flag. */ public void setDeprecation(String deprecationString) { this.deprecation =3D Project.toBoolean(deprecationString); } /** * Set the debug flag. */ public void setDebug(String debugString) { this.debug =3D Project.toBoolean(debugString); } /** * Set the optimize flag. */ public void setOptimize(String optimizeString) { this.optimize =3D Project.toBoolean(optimizeString); } /** * Sets the target VM that the classes will be compiled for. Valid * strings are "1.1", "1.2", and "1.3". */ public void setTarget(String target) { this.target =3D target; } /** * Set the filtering flag. */ public void setFiltering(String filter) { filtering =3D Project.toBoolean(filter); } /** * Executes the task. */ public void execute() throws BuildException { // first off, make sure that we've got a srcdir and destdir if (srcDir =3D=3D null) { throw new BuildException("srcdir attribute must be set!"); } if (!srcDir.exists()) { throw new BuildException("srcdir does not exist!"); } if (destDir =3D=3D null) { throw new BuildException("destdir attribute must be set!"); } // scan source and dest dirs to build up both copy lists and // compile lists DirectoryScanner ds =3D this.getDirectoryScanner(srcDir); String[] files =3D ds.getIncludedFiles(); scanDir(srcDir, destDir, files); // compile the source files String compiler =3D project.getProperty("build.compiler"); if (compiler =3D=3D null) { if (Project.getJavaVersion().startsWith("1.3")) { compiler =3D "modern"; } else { compiler =3D "classic"; } } if (compileList.size() > 0) { project.log("Compiling " + compileList.size() + " source files to " + destDir); if (compiler.equalsIgnoreCase("classic")) { doClassicCompile(); } else if (compiler.equalsIgnoreCase("modern")) { doModernCompile(); } else if (compiler.equalsIgnoreCase("jikes")) { doJikesCompile(); } else { String msg =3D "Don't know how to use compiler " + = compiler; throw new BuildException(msg); } } // copy the support files if (filecopyList.size() > 0) { project.log("Copying " + filecopyList.size() + " support files to " + = destDir.getAbsolutePath()); Enumeration enum =3D filecopyList.keys(); while (enum.hasMoreElements()) { String fromFile =3D (String) enum.nextElement(); String toFile =3D (String) filecopyList.get(fromFile); try { project.copyFile(fromFile, toFile, filtering); } catch (IOException ioe) { String msg =3D "Failed to copy " + fromFile + " to " = + toFile + " due to " + ioe.getMessage(); throw new BuildException(msg); } } } } /** * Scans the directory looking for source files to be compiled and * support files to be copied. The results are returned in the * class variables compileList and filecopyList. */ protected void scanDir(File srcDir, File destDir, String files[]) { compileList.removeAllElements(); filecopyList.clear(); long now =3D (new Date()).getTime(); for (int i =3D 0; i < files.length; i++) { File srcFile =3D new File(srcDir, files[i]); if (files[i].endsWith(".java")) { File classFile =3D new File(destDir, = files[i].substring(0, files[i].indexOf(".java")) + ".class"); if (srcFile.lastModified() > now) { project.log("Warning: file modified in the = future: " +=20 files[i], project.MSG_WARN); } if (srcFile.lastModified() > = classFile.lastModified()) { = compileList.addElement(srcFile.getAbsolutePath()); } } else { File destFile =3D new File(destDir, files[i]); if (srcFile.lastModified() > = destFile.lastModified()) { filecopyList.put(srcFile.getAbsolutePath(), destFile.getAbsolutePath()); } } } } /** * Builds the compilation classpath. */ // XXX // we need a way to not use the current classpath. private String getCompileClasspath() { StringBuffer classpath =3D new StringBuffer(); // add dest dir to classpath so that previously compiled and // untouched classes are on classpath //classpath.append(sourceDir.getAbsolutePath()); //classpath.append(File.pathSeparator); classpath.append(destDir.getAbsolutePath()); // add our classpath to the mix if (compileClasspath !=3D null) { addExistingToClasspath(classpath,compileClasspath); } // add the system classpath = addExistingToClasspath(classpath,System.getProperty("java.class.path")); return classpath.toString(); } /** * Takes a classpath-like string, and adds each element of * this string to a new classpath, if the components exist. * Components that don't exist, aren't added. * We do this, because jikes issues warnings for non-existant * files/dirs in his classpath, and these warnings are pretty * annoying. * @param target - target classpath * @param source - source classpath * to get file objects. */ private void addExistingToClasspath(StringBuffer target,String = source) { StringTokenizer tok =3D new StringTokenizer(source, System.getProperty("path.separator"), = false); while (tok.hasMoreTokens()) { File f =3D project.resolveFile(tok.nextToken()); if (f.exists()) { target.append(File.pathSeparator); target.append(f.getAbsolutePath()); } else { project.log("Dropping from classpath: "+ f.getAbsolutePath(),project.MSG_VERBOSE); } } } /** * Peforms a copmile using the classic compiler that shipped with * JDK 1.1 and 1.2. */ private void doClassicCompile() throws BuildException { project.log("Using classic compiler", project.MSG_VERBOSE); String classpath =3D getCompileClasspath(); Vector argList =3D new Vector(); if (deprecation =3D=3D true) argList.addElement("-deprecation"); argList.addElement("-d"); argList.addElement(destDir.getAbsolutePath()); argList.addElement("-classpath"); // Just add "sourcepath" to classpath ( for JDK1.1 ) if (Project.getJavaVersion().startsWith("1.1")) { argList.addElement(classpath + File.pathSeparator + srcDir.getAbsolutePath()); } else { argList.addElement(classpath); argList.addElement("-sourcepath"); argList.addElement(srcDir.getAbsolutePath()); if (target !=3D null) { argList.addElement("-target"); argList.addElement(target); } } if (debug) { argList.addElement("-g"); } if (optimize) { argList.addElement("-O"); } if (bootclasspath !=3D null) { argList.addElement("-bootclasspath"); argList.addElement(bootclasspath); } if (extdirs !=3D null) { argList.addElement("-extdirs"); argList.addElement(extdirs); } project.log("Compilation args: " + argList.toString(), project.MSG_VERBOSE); String[] args =3D new String[argList.size() + = compileList.size()]; int counter =3D 0; for (int i =3D 0; i < argList.size(); i++) { args[i] =3D (String)argList.elementAt(i); counter++; } // XXX // should be using system independent line feed! StringBuffer niceSourceList =3D new StringBuffer("Files to be = compiled:" + "\r\n"); Enumeration enum =3D compileList.elements(); while (enum.hasMoreElements()) { args[counter] =3D (String)enum.nextElement(); niceSourceList.append(" " + args[counter] + "\r\n"); counter++; } project.log(niceSourceList.toString(), project.MSG_VERBOSE); // XXX // provide the compiler a different message sink - namely our = own JavacOutputStream jos =3D new JavacOutputStream(project); sun.tools.javac.Main compiler =3D new sun.tools.javac.Main(jos, "javac"); compiler.compile(args); if (jos.getErrorFlag()) { String msg =3D "Compile failed, messages should have been = provided."; throw new BuildException(msg); } } /** * Performs a compile using the newer compiler that ships with JDK = 1.3 */ private void doModernCompile() throws BuildException { project.log("Performing a Modern Compile"); } /** * Performs a compile using the Jikes compiler from IBM.. * Mostly of this code is identical to doClassicCompile() * However, it does not support all options like * bootclasspath, extdirs, deprecation and so on, because * there is no option in jikes and I don't understand * what they should do. * * It has been successfully tested with jikes 1.10 * * @author skanthak@muehlheim.de */ private void doJikesCompile() throws BuildException { =20 int NT_COMMAND_LIMIT =3D -1; String osName =3D System.getProperty("os.name"); if ( osName.startsWith("Windows")) { NT_COMMAND_LIMIT =3D 300; } else { NT_COMMAND_LIMIT =3D Integer.MAX_VALUE; } =20 =20 =20 project.log("Using jikes compiler",project.MSG_VERBOSE); StringBuffer classpath =3D new StringBuffer(); classpath.append(getCompileClasspath()); // Jikes doesn't support an extension dir (-extdir) // so we'll emulate it for compatibility and convenience. addExtdirsToClasspath(classpath); // Jikes has no option for source-path so we // will add it to classpath. classpath.append(File.pathSeparator); classpath.append(srcDir.getAbsolutePath()); Vector argList =3D new Vector(); =20 argList.addElement("-depend"); =20 if (deprecation =3D=3D true) argList.addElement("-deprecation"); // We want all output on stdout to make // parsing easier argList.addElement("-Xstdout"); argList.addElement("-d"); argList.addElement(destDir.getAbsolutePath()); argList.addElement("-classpath"); argList.addElement(classpath.toString()); if (debug) { argList.addElement("-g"); } if (optimize) { argList.addElement("-O"); } /** * XXX * Perhaps we shouldn't use properties for these * two options (emacs mode and warnings), * but include it in the javac directive? */ /** * Jikes has the nice feature to print error * messages in a form readable by emacs, so * that emcas can directly set the cursor * to the place, where the error occured. */ boolean emacsMode =3D false; String emacsProperty =3D = project.getProperty("build.compiler.emacs"); if (emacsProperty !=3D null && (emacsProperty.equalsIgnoreCase("on") || emacsProperty.equalsIgnoreCase("true")) ) { emacsMode =3D true; } /** * Jikes issues more warnings that javac, for * example, when you have files in your classpath * that don't exist. As this is often the case, these * warning can be pretty annoying. */ boolean warnings =3D true; String warningsProperty =3D = project.getProperty("build.compiler.warnings"); if (warningsProperty !=3D null && (warningsProperty.equalsIgnoreCase("off") || warningsProperty.equalsIgnoreCase("false")) ) { warnings =3D false; } if (emacsMode) argList.addElement("+E"); if (!warnings) argList.addElement("-nowarn"); =20 =20 project.log("Compilation args: " + argList.toString(), project.MSG_VERBOSE); =20 int execCount =3D compileList.size() / NT_COMMAND_LIMIT; int remainder =3D compileList.size() % NT_COMMAND_LIMIT; if (remainder > 0 && execCount !=3D 0) execCount++; if (execCount =3D=3D 0) execCount =3D 1; =20 Vector[] files =3D new Vector[execCount]; =20 for (int i =3D 0; i < execCount - 1; i++) { files[i] =3D new Vector(); int slice =3D (i + 1) * NT_COMMAND_LIMIT; =20 for (int j =3D i*NT_COMMAND_LIMIT; j < slice; j++) { files[i].addElement(compileList.elementAt(j)); } } int remainderStart =3D (execCount - 1) * NT_COMMAND_LIMIT; files[execCount - 1] =3D new Vector(); for (int j =3D (execCount - 1) * NT_COMMAND_LIMIT; j < = remainderStart + remainder; j++) { files[execCount - 1].addElement(compileList.elementAt(j)); } =20 // XXX // should be using system independent line feed! for (int i =3D 0; i < execCount; i++) { int counter =3D 0; String[] args =3D new String[argList.size() + = files[i].size()]; // + compileList.size()]; for (int j =3D 0; j < argList.size(); j++) { args[j] =3D (String)argList.elementAt(j); counter++; } =20 StringBuffer niceSourceList =3D new StringBuffer("Files to = be compiled:" + "\r\n"); // Add the list of files to the args[] array Enumeration enum =3D files[i].elements(); =20 while (enum.hasMoreElements()) { args[counter] =3D (String)enum.nextElement(); niceSourceList.append(" " + args[counter] + "\r\n"); counter++; } =20 project.log(niceSourceList.toString(), project.MSG_VERBOSE); =20 // XXX // provide the compiler a different message sink - namely = our own =20 JikesOutputParser jop =3D new = JikesOutputParser(project,emacsMode); =20 if (execCount > 1) project.log("[FYI]Split compile list, over limit of 300 = files, running the #" + (i+1) + " compile",project.MSG_VERBOSE); =20 Jikes compiler =3D new Jikes(jop,"jikes"); compiler.compile(args); if (jop.getErrorFlag()) { String msg =3D "Compile failed, messages should have = been provided."; throw new BuildException(msg); } } } class JarFilenameFilter implements FilenameFilter { public boolean accept(File dir,String name) { return name.endsWith(".jar"); } } /** * Emulation of extdirs feature in java >=3D 1.2. * This method adds all jar archives in the given * directories (but not in sub-directories!) to the classpath, * so that you don't have to specify them all one by one. * @param classpath - stringbuffer to append jar files to */ private void addExtdirsToClasspath(StringBuffer classpath) { // FIXME // Should we scan files recursively? How does // javac handle this? if (extdirs !=3D null) { StringTokenizer tok =3D new StringTokenizer(extdirs, File.pathSeparator, false); while (tok.hasMoreTokens()) { File dir =3D project.resolveFile(tok.nextToken()); String[] files =3D dir.list(new JarFilenameFilter()); for (int i=3D0 ; i < files.length ; i++) { File f =3D new File(dir,files[i]); if (f.exists() && f.isFile()) { classpath.append(File.pathSeparator); classpath.append(f.getAbsolutePath()); } } } } } } ------=_NextPart_000_0013_01BFFCA9.F51F8760--