Below is a sample specification in either project.properties or
build.properties:

lib.repo.dynamic = c:/cvs/portal/lib, c:/cvs/portal/lib/build

lib.repo.dynamic.exclude = c:/cvs/portal/lib/boot.jar,
c:/cvs/portal/lib/boot_app.jar, \
        c:/cvs/portal/lib/boot_remote.jar,
c:/cvs/portal/lib/build/rcoll.jar, \
         c:/cvs/portal/lib/build/ejb_sl_tiff2gif.jar,
c:/cvs/portal/lib/build/transportv2.jar

Hanson
> -----Original Message-----
> From: Hanson Char 
> Sent: Friday, June 07, 2002 11:57 AM
> To: '[EMAIL PROTECTED]'
> Cc: NYC06-RCJAVA; NYC06-IHUB
> Subject: Optional Feature: Zero dependency configuration
> 
> 
> I notice the need in Maven to specify the jar/zip file 
> dependency both in the project.xml and in "lib.repo" or 
> "maven.repo.remote".
> 
> However, our existing projects have pretty large sizes using 
> a lot of jar/zip files residing in multiple directories.  So 
> I suggest to support of the optional feature of "zero 
> dependency configuration".
> 
> Specifically,
> 
> 1) specify the "lib.repo.dynamic" property to point to a list 
> of directories or direct jar/zip files.  Jar/zip files both 
> from those directories and directly specified will be 
> automatically added to the runtime classpath by Maven.
> 
> 2) specify the "lib.repo.dynamic.exclude" property to point 
> to a list of jar/zip files to be explicitly excluded from 
> being loaded during the dynamic loading process.
> 
> 3) (2) always overrides (1).
> 
> 4) These properties are an optional features, and they can 
> work with the existing properties of Maven at the same time 
> without conflicts.
> 
> By using these properties, the <dependencies> elements can be 
> entirely commented out or omitted from project.xml.
> 
> To support the new properties, I created on class 
> DynamicRepo.java and added one line of code to 
> ProjectProperties.java (MAVEN_1_0_B4 (revision: 1.43)).
> 
> Please find below the source codes for the suggested changes. 
>  They work nicely in our installation.
> 
> Just wonder if your group like the idea, and if so if you can 
> incorporate the changes to your CVS repository, so we can 
> still have the feature for future releases.
> 
> Thanks,
> Hanson
> 
> org.apache.maven.ProjectProperties.java 
> ---------------------------------------
>     private void createClasspathReference()
>     {
>         Path classpath = new Path(getProject());
> 
>         for (Iterator i = 
> getMavenProject().getDependencies().iterator();
>              i.hasNext();)
>         {
>             Dependency dependency = (Dependency) i.next();
> 
>             Path p = new Path(getProject());
>             p.setPath(new File(libRepo, 
> dependency.getJar()).getAbsolutePath());
>             classpath.append(p);
>         }
>         ///////////// Change: start
>         DynamicRepo.addDynClasspathReference(getProject(), classpath);
>         ///////////// Change: end
>         
> getProject().addReference("maven.dependency.classpath", classpath);
>     }
> 
> org.apache.maven.DynamicRepo.java (new class)
> ---------------------------------
> package org.apache.maven;
> 
> import java.io.*;
> import java.util.*;
> 
> import org.apache.tools.ant.*;
> import org.apache.tools.ant.types.*;
> /**
>  * Dynamic repository which supports the optional feature of 
> zero-dependency configuration.
>  * It automatic loads a set of jar/zip files to the classpath 
> from a list of comma-delimited
>  * directories or files specified in the project property 
> "lib.repo.dynamic".
>  *
>  * An optional set of files can be explicitely excluded from 
> being loaded via the dynamic repository.
>  * These files are specified as a list of comma-delimited 
> jar/zip files in the
>  * project property "lib.repo.dynamic.exclude".
>  *
>  * @author Hanson Char
>  * @version 1.0
>  */
> class DynamicRepo {
>   private static final String DELIMITER = ",";
>   /**
>    * Dynamically adds the jar/zip files to the classpath.
>    * @project the current project.
>    * @classpath the current classpath.
>    */
>   static void addDynClasspathReference(Project project, final 
> Path classpath)
>   {
>     String dynlibRepo = project.getProperty("lib.repo.dynamic");
> 
>     if (dynlibRepo == null || dynlibRepo.trim().length() == 0) {
>       // dynamic repository not specified.
>       return;
>     }
>     final Set excludeFileSet = 
> loadExcludeFileSet(project.getProperty("lib.repo.dynamic.exclude"));
>     // Figure out the set of file/dir to be used for dynamic lookup.
>     StringTokenizer st = new StringTokenizer(dynlibRepo, 
> DELIMITER, true);
> 
>     while (st.hasMoreTokens()) {
>       String token = st.nextToken();
> 
>       if (token.equals(DELIMITER)) {
>         continue;
>       }
>       File file = new File(token.trim());
> 
>       if (!file.exists()) {
>         continue;
>       }
>       if (file.isFile()) {
>         String name = file.getName();
> 
>         if (name.endsWith(".jar") || name.endsWith(".zip")) {
>           if (!excludeFileSet.contains(file)) {
>             addFilesToClasspath(project, classpath, new File[]{file});
>           }
>         }
>         continue;
>       }
>       // directory.
>       File[] list = file.listFiles(new FilenameFilter() {
>         public boolean accept(File dir, String name) {
>           return (name.endsWith(".jar") || name.endsWith(".zip"))
>             && !excludeFileSet.contains(new File(dir, name));
>         }
>       });
>       addFilesToClasspath(project, classpath, list);
>     }
>   }
>   /** Returns a set of jar/zip files to be excluded from 
> dynamic loading. */
>   private static Set loadExcludeFileSet(String dynlibRepoExclude) {
>     Set set = new HashSet();
> 
>     if (dynlibRepoExclude == null || 
> dynlibRepoExclude.trim().length() == 0) {
>       // exclude list not specified.
>       return set;
>     }
>     StringTokenizer st = new 
> StringTokenizer(dynlibRepoExclude, DELIMITER, true);
> 
>     while (st.hasMoreTokens()) {
>       String token = st.nextToken();
> 
>       if (token.equals(DELIMITER)) {
>         continue;
>       }
>       File file = new File(token.trim());
> 
>       if (!file.exists() || !file.isFile()) {
>         continue;
>       }
>       String name = file.getName();
> 
>       if (!name.endsWith(".jar") && !name.endsWith(".zip")) {
>         continue;
>       }
>       set.add(file);
>     }
>     return set;
>   }
>   /** Adds the given set of files to the specified classpath. */
>   private static void addFilesToClasspath(Project project, 
> Path classpath, File[] file)
>   {
>     for (int i=0; i < file.length; i++) {
>       Path p = new Path(project);
>       System.out.println(new StringBuffer()
>         .append("DynamicRepo>>Adding ")
>         .append(file[i])
>         .append(" to classpath.")
>         .toString());
>       p.setPath(file[i].getAbsolutePath());
>       classpath.append(p);
>     }
>   }
> }
> 
> /////////////////////////////// end ///////////////////////////////
> 

Reply via email to