ServerStarter.java 4.59 KB
Newer Older
1 2
/*
 *
3
 * Copyright (C) 2004-2008 Jive Software. All rights reserved.
4
 *
5 6 7 8 9 10 11 12 13 14 15
 * 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.
16 17
 */

18
package org.jivesoftware.openfire.starter;
19

20
import org.jivesoftware.util.Log;
21

22
import java.io.File;
23 24 25 26
/**
 * Starts the core XMPP server. A bootstrap class that configures classloaders
 * to ensure easy, dynamic server startup.
 *
27
 * This class should be for standalone mode only. Openfire servers launched
28 29 30 31
 * through a J2EE container (servlet/EJB) will use those environment's
 * classloading facilities to ensure proper startup.<p>
 *
 * Tasks:<ul>
Matt Tucker's avatar
Matt Tucker committed
32
 *      <li>Unpack any pack files in the lib directory (Pack200 encoded JAR files).</li>
33 34 35 36 37
 *      <li>Add all jars in the lib directory to the classpath.</li>
 *      <li>Add the config directory to the classpath for loadResource()</li>
 *      <li>Start the server</li>
 * </ul>
 *
38
 * Note: if the enviroment property <tt>openfire.lib.dir</tt> is specified
39
 * ServerStarter will attempt to use this value as the value for openfire's lib
40 41 42 43 44 45 46 47 48 49
 * directory. If the property is not specified the default value of ../lib will be used.
 *
 * @author Iain Shigeoka
 */
public class ServerStarter {

    /**
     * Default to this location if one has not been specified
     */
    private static final String DEFAULT_LIB_DIR = "../lib";
50
    private static final String DEFAULT_ADMIN_LIB_DIR = "../plugins/admin/webapp/WEB-INF/lib";
51 52 53 54 55 56 57 58 59 60 61

    public static void main(String [] args) {
        new ServerStarter().start();
    }

    /**
     * Starts the server by loading and instantiating the bootstrap
     * container. Once the start method is called, the server is
     * started and the server starter should not be used again.
     */
    private void start() {
62
        // Setup the classpath using JiveClassLoader
63 64 65 66
        try {
            // Load up the bootstrap container
            final ClassLoader parent = findParentClassLoader();

Gaston Dombiak's avatar
Gaston Dombiak committed
67
            String libDirString = System.getProperty("openfire.lib.dir");
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

            File libDir;
            if (libDirString != null) {
                // If the lib directory property has been specified and it actually
                // exists use it, else use the default
                libDir = new File(libDirString);
                if (!libDir.exists()) {
                    Log.warn("Lib directory " + libDirString +
                            " does not exist. Using default " + DEFAULT_LIB_DIR);
                    libDir = new File(DEFAULT_LIB_DIR);
                }
            }
            else {
                libDir = new File(DEFAULT_LIB_DIR);
            }

84 85 86 87 88 89 90 91
            String adminLibDirString = System.getProperty("openfireHome");
            if (adminLibDirString == null) {
                adminLibDirString = DEFAULT_ADMIN_LIB_DIR;
            }
            else {
                adminLibDirString = adminLibDirString+"/plugins/admin/webapp/WEB-INF/lib";
            }
            File adminLibDir = new File(adminLibDirString);
92
            if (!adminLibDir.exists()) {
93 94 95
                Log.warn("Admin Lib Directory " + adminLibDirString +
                    " does not exist. Web admin console may not work.");
            }
Matt Tucker's avatar
Matt Tucker committed
96

97
            ClassLoader loader = new JiveClassLoader(parent, libDir);
Matt Tucker's avatar
Matt Tucker committed
98

99 100
            Thread.currentThread().setContextClassLoader(loader);
            Class containerClass = loader.loadClass(
101
                    "org.jivesoftware.openfire.XMPPServer");
102 103 104
            containerClass.newInstance();
        }
        catch (Exception e) {
105
            e.printStackTrace();
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
        }
    }

    /**
     * Locates the best class loader based on context (see class description).
     *
     * @return The best parent classloader to use
     */
    private ClassLoader findParentClassLoader() {
        ClassLoader parent = Thread.currentThread().getContextClassLoader();
        if (parent == null) {
            parent = this.getClass().getClassLoader();
            if (parent == null) {
                parent = ClassLoader.getSystemClassLoader();
            }
        }
        return parent;
    }
124
}