James Moger
2012-11-28 0bbdd9f9adf12ad9082a4c49ae1c9a0778b00bb4
src/com/gitblit/Launcher.java
@@ -22,56 +22,76 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.security.ProtectionDomain;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.gitblit.build.Build;
/**
 * Launch helper class that adds all jars found in the local "lib" folder and
 * then calls the application main. Using this technique we do not have to
 * specify a classpath and we can dynamically add jars to the distribution.
 * Launch helper class that adds all jars found in the local "lib" & "ext"
 * folders and then calls the application main. Using this technique we do not
 * have to specify a classpath and we can dynamically add jars to the
 * distribution.
 *
 * This class also downloads all runtime dependencies, if they are not found.
 *
 * @author James Moger
 * 
 */
public class Launcher {
   public final static boolean debug = false;
   public static final boolean DEBUG = false;
   /**
    * Parameters of the method to add an URL to the System classes.
    */
   private static final Class<?>[] PARAMETERS = new Class[] { URL.class };
   public static void main(String[] args) {
      if (debug)
      if (DEBUG) {
         System.out.println("jcp=" + System.getProperty("java.class.path"));
         ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
         System.out.println("launcher="
               + protectionDomain.getCodeSource().getLocation().toExternalForm());
      }
      ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
      final String launchJar = protectionDomain.getCodeSource().getLocation().toExternalForm();
      if (debug)
         System.out.println("launcher=" + launchJar);
      // download all runtime dependencies
      Build.runtime();
      // Load the JARs in the lib and ext folder
      String[] folders = new String[] { "lib", "ext" };
      List<File> jars = new ArrayList<File>();
      for (String folder : folders) {
         if (folder == null)
         if (folder == null) {
            continue;
         File libFolder = new File(folder);
         if (!libFolder.exists())
            continue;
         try {
            libFolder = libFolder.getCanonicalFile();
         } catch (IOException iox) {
         }
         jars.addAll(findJars(libFolder));
         File libFolder = new File(folder);
         if (!libFolder.exists()) {
            continue;
         }
         List<File> found = findJars(libFolder.getAbsoluteFile());
         jars.addAll(found);
      }
      // sort the jars by name and then reverse the order so the newer version
      // of the library gets loaded in the event that this is an upgrade
      Collections.sort(jars);
      Collections.reverse(jars);
      if (jars.size() == 0) {
         for (String folder : folders) {
            File libFolder = new File(folder);
            System.err.println("Failed to find any JARs in " + libFolder.getPath());
            // this is a test of adding a comment
            // more really interesting things
            System.err.println("Failed to find any really cool JARs in " + libFolder.getPath());
         }
         System.exit(-1);
      } else {
         for (File jar : jars) {
            try {
               jar.canRead();
               addJarFile(jar);
            } catch (Throwable t) {
               t.printStackTrace();
@@ -94,19 +114,16 @@
         });
         if (libs != null && libs.length > 0) {
            jars.addAll(Arrays.asList(libs));
            if (debug) {
               for (File jar : jars)
            if (DEBUG) {
               for (File jar : jars) {
                  System.out.println("found " + jar);
               }
            }
         }
      }
      return jars;
   }
   /**
    * Parameters of the method to add an URL to the System classes.
    */
   private static final Class<?>[] parameters = new Class[] { URL.class };
   /**
    * Adds a file to the classpath
@@ -121,16 +138,18 @@
         return;
      }
      URL u = f.toURI().toURL();
      if (debug)
      if (DEBUG) {
         System.out.println("load=" + u.toExternalForm());
      }
      URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
      Class<?> sysclass = URLClassLoader.class;
      try {
         Method method = sysclass.getDeclaredMethod("addURL", parameters);
         Method method = sysclass.getDeclaredMethod("addURL", PARAMETERS);
         method.setAccessible(true);
         method.invoke(sysloader, new Object[] { u });
      } catch (Throwable t) {
         throw new IOException("Error, could not add " + f.getPath() + " to system classloader", t);
         throw new IOException(MessageFormat.format(
               "Error, could not add {0} to system classloader", f.getPath()), t);
      }
   }
}