diff options
author | James Moger <james.moger@gitblit.com> | 2013-07-02 15:13:04 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2013-07-02 15:13:04 -0400 |
commit | 4f404712c8ebcff78a5702cf0192568c7b9ee226 (patch) | |
tree | 46416ed4244aa695cb70a1f5769eca024b4ff342 /src/main/java/com/gitblit/Launcher.java | |
parent | 2c616775b21ab4cd76ff170dfd5e818c9c3b79fb (diff) | |
download | gitblit-4f404712c8ebcff78a5702cf0192568c7b9ee226.tar.gz gitblit-4f404712c8ebcff78a5702cf0192568c7b9ee226.zip |
Restored original GO launcher class
Diffstat (limited to 'src/main/java/com/gitblit/Launcher.java')
-rw-r--r-- | src/main/java/com/gitblit/Launcher.java | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/main/java/com/gitblit/Launcher.java b/src/main/java/com/gitblit/Launcher.java new file mode 100644 index 00000000..ed465f03 --- /dev/null +++ b/src/main/java/com/gitblit/Launcher.java @@ -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); + } + } +} |