public void start() {
        try {
            initialize();

            // Create PluginManager now (but don't start it) so that modules may use it
            Path pluginDir = openfireHome.resolve("plugins");
            pluginManager = new PluginManager(pluginDir);

            // If the server has already been setup then we can start all the server's modules
            if (!setupMode) {
                verifyDataSource();
                // First load all the modules so that modules may access other modules while
                // being initialized
                loadModules();
                // Initize all the modules
                initModules();
                // Start all the modules
                startModules();
            }
            // Initialize statistics
            ServerTrafficCounter.initStatistics();

            // Load plugins (when in setup mode only the admin console will be loaded)
            pluginManager.start();

            // Log that the server has been started
            String startupBanner = LocaleUtils.getLocalizedString("short.title") + " " + xmppServerInfo.getVersion().getVersionString() +
                    " [" + JiveGlobals.formatDateTime(new Date()) + "]";
            logger.info(startupBanner);
            System.out.println(startupBanner);

            started = true;
            
            // Notify server listeners that the server has been started
            for (XMPPServerListener listener : listeners) {
                try {
                    listener.serverStarted();
                } catch (Exception e) {
                    logger.warn("An exception occurred while dispatching a 'serverStarted' event!", e);
                }
            }

            if (!setupMode) {
                scanForSystemPropertyClasses();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            System.out.println(LocaleUtils.getLocalizedString("startup.error"));
            shutdownServer();
        }
    }
Finish the setup process. Because this method is meant to be called from inside
the Admin console plugin, it spawns its own thread to do the work so that the
class loader is correct.
xmppserver/src/main/java/org/jivesoftware/openfire/XMPPServer.java