James Moger
2013-07-02 4f404712c8ebcff78a5702cf0192568c7b9ee226
Restored original GO launcher class
1 files added
148 ■■■■■ changed files
src/main/java/com/gitblit/Launcher.java 148 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/Launcher.java
New file
@@ -0,0 +1,148 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.reflect.Method;
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;
/**
 * 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.
 *
 * @author James Moger
 *
 */
public class Launcher {
    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) {
            System.out.println("jcp=" + System.getProperty("java.class.path"));
            ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
            System.out.println("launcher="
                    + protectionDomain.getCodeSource().getLocation().toExternalForm());
        }
        // 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) {
                continue;
            }
            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);
                // this is a test of adding a comment
                // more really interesting things
                System.err.println("Failed to find any JARs in " + libFolder.getPath());
            }
            System.exit(-1);
        } else {
            for (File jar : jars) {
                try {
                    jar.canRead();
                    addJarFile(jar);
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
        }
        // Start Server
        GitBlitServer.main(args);
    }
    public static List<File> findJars(File folder) {
        List<File> jars = new ArrayList<File>();
        if (folder.exists()) {
            File[] libs = folder.listFiles(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return !file.isDirectory() && file.getName().toLowerCase().endsWith(".jar");
                }
            });
            if (libs != null && libs.length > 0) {
                jars.addAll(Arrays.asList(libs));
                if (DEBUG) {
                    for (File jar : jars) {
                        System.out.println("found " + jar);
                    }
                }
            }
        }
        return jars;
    }
    /**
     * Adds a file to the classpath
     *
     * @param f
     *            the file to be added
     * @throws IOException
     */
    public static void addJarFile(File f) throws IOException {
        if (f.getName().indexOf("-sources") > -1 || f.getName().indexOf("-javadoc") > -1) {
            // don't add source or javadoc jars to runtime classpath
            return;
        }
        URL u = f.toURI().toURL();
        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.setAccessible(true);
            method.invoke(sysloader, new Object[] { u });
        } catch (Throwable t) {
            throw new IOException(MessageFormat.format(
                    "Error, could not add {0} to system classloader", f.getPath()), t);
        }
    }
}