/* * * Copyright (C) 2004-2008 Jive Software. All rights reserved. * * 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 org.jivesoftware.openfire.starter; import org.jivesoftware.util.Log; import java.io.File; /** * Starts the core XMPP server. A bootstrap class that configures classloaders * to ensure easy, dynamic server startup. * * This class should be for standalone mode only. Openfire servers launched * through a J2EE container (servlet/EJB) will use those environment's * classloading facilities to ensure proper startup.<p> * * Tasks:<ul> * <li>Unpack any pack files in the lib directory (Pack200 encoded JAR files).</li> * <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> * * Note: if the enviroment property <tt>openfire.lib.dir</tt> is specified * ServerStarter will attempt to use this value as the value for openfire's lib * 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"; private static final String DEFAULT_ADMIN_LIB_DIR = "../plugins/admin/webapp/WEB-INF/lib"; 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() { // Setup the classpath using JiveClassLoader try { // Load up the bootstrap container final ClassLoader parent = findParentClassLoader(); String libDirString = System.getProperty("openfire.lib.dir"); 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); } 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); if (!adminLibDir.exists()) { Log.warn("Admin Lib Directory " + adminLibDirString + " does not exist. Web admin console may not work."); } ClassLoader loader = new JiveClassLoader(parent, libDir); Thread.currentThread().setContextClassLoader(loader); Class containerClass = loader.loadClass( "org.jivesoftware.openfire.XMPPServer"); containerClass.newInstance(); } catch (Exception e) { e.printStackTrace(); } } /** * 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; } }