Antoine Lévy-Lambert wrote:
Hi Peter,
can we improve the new classloader so that the work of inspecting the
jars does not happen each time an <antcall/> is done ?
Yes by keeping a static map of file->manifest class path.
With the following:
<project default="call-all">
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<taskdef resource="cpptasks.tasks"/>
<typedef resource="cpptasks.types"/>
<target name="call-all">
<foreach list="1,2,3,4,5,6,7,8,9,10" param="name" target="doit"/>
<echo>Done</echo>
</target>
<target name="doit">
<foreach list="1,2,3,4,5,6,7,8,9,10" param="name" target="doit2"/>
</target>
<target name="doit2"/>
</project>
and the included patch, the time is reduced from 6 seconds to 3
seconds - not
a great improvement considering that there is 100 ant-calls, but it is
a improvement!
Peter
------------------------------------------------------------------------
Index: src/main/org/apache/tools/ant/loader/AntClassLoader2.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/loader/AntClassLoader2.java,v
retrieving revision 1.7
diff -u -r1.7 AntClassLoader2.java
--- src/main/org/apache/tools/ant/loader/AntClassLoader2.java 17 Jul 2003
10:36:27 -0000 1.7
+++ src/main/org/apache/tools/ant/loader/AntClassLoader2.java 15 Jan 2004
17:34:19 -0000
@@ -1,7 +1,7 @@
/*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * Copyright (c) 2003-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -68,6 +68,9 @@
import java.net.URL;
import java.net.MalformedURLException;
import java.util.zip.ZipEntry;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import java.util.StringTokenizer;
import org.apache.tools.ant.util.FileUtils;
@@ -81,6 +84,9 @@
/** Instance of a utility class to use for file operations. */
private FileUtils fileUtils;
+ /** Static map of jar file/time to manifiest class-path entries */
+ private static Map pathMap = Collections.synchronizedMap(new HashMap());
+
/**
* Constructor
*/
@@ -272,36 +278,46 @@
return;
}
+ String absPathPlusTimeAndLength =
+ pathComponent.getAbsolutePath() + pathComponent.lastModified() +
"-"
+ + pathComponent.length();
String classpath = null;
- ZipFile jarFile = null;
- InputStream manifestStream = null;
- try {
- jarFile = new ZipFile(pathComponent);
- manifestStream
- = jarFile.getInputStream(new ZipEntry("META-INF/MANIFEST.MF"));
-
- if (manifestStream == null) {
- return;
- }
- Reader manifestReader
- = new InputStreamReader(manifestStream, "UTF-8");
- org.apache.tools.ant.taskdefs.Manifest manifest
- = new org.apache.tools.ant.taskdefs.Manifest(manifestReader);
- classpath
- = manifest.getMainSection().getAttributeValue("Class-Path");
+ classpath = (String) pathMap.get(absPathPlusTimeAndLength);
+ if (classpath == null) {
+ ZipFile jarFile = null;
+ InputStream manifestStream = null;
+ try {
+ jarFile = new ZipFile(pathComponent);
+ manifestStream
+ = jarFile.getInputStream(new
ZipEntry("META-INF/MANIFEST.MF"));
+
+ if (manifestStream == null) {
+ return;
+ }
+ Reader manifestReader
+ = new InputStreamReader(manifestStream, "UTF-8");
+ org.apache.tools.ant.taskdefs.Manifest manifest
+ = new
org.apache.tools.ant.taskdefs.Manifest(manifestReader);
+ classpath
+ =
manifest.getMainSection().getAttributeValue("Class-Path");
- } catch (org.apache.tools.ant.taskdefs.ManifestException e) {
- // ignore
- } finally {
- if (manifestStream != null) {
- manifestStream.close();
+ } catch (org.apache.tools.ant.taskdefs.ManifestException e) {
+ // ignore
+ } finally {
+ if (manifestStream != null) {
+ manifestStream.close();
+ }
+ if (jarFile != null) {
+ jarFile.close();
+ }
}
- if (jarFile != null) {
- jarFile.close();
+ if (classpath == null) {
+ classpath = "";
}
+ pathMap.put(absPathPlusTimeAndLength, classpath);
}
- if (classpath != null) {
+ if (!"".equals(classpath)) {
URL baseURL = fileUtils.getFileURL(pathComponent);
StringTokenizer st = new StringTokenizer(classpath);
while (st.hasMoreTokens()) {
------------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]