@Override
  public void contextInitialized(ServletContextEvent servletContextEvent) {
    ServletContext servletContext = servletContextEvent.getServletContext();

    String contextPath = servletContext.getRealPath(StringPool.BLANK);
    String spiEmbeddedLibDirName = servletContext.getInitParameter("spiEmbeddedLibDir");

    Set<File> jarFiles = new LinkedHashSet<File>();

    // Load embedded Tomcat

    File spiEmbeddedLibDir = new File(contextPath, spiEmbeddedLibDirName);

    addJarFiles(jarFiles, spiEmbeddedLibDir);

    // Load portal-service.jar from MPI

    addJarFiles(jarFiles, PortalClassLoaderUtil.getClassLoader(), PortalException.class.getName());

    // Load JDBC driver jars from MPI

    addJarFiles(
        jarFiles,
        PortalClassLoaderUtil.getClassLoader(),
        PropsUtil.get(PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME));

    // Load ext jars

    addJarFiles(jarFiles, new File(spiEmbeddedLibDir, "ext"));

    StringBundler sb = new StringBundler(jarFiles.size() * 2 + 4);

    for (File file : jarFiles) {
      sb.append(file.getAbsolutePath());
      sb.append(File.pathSeparator);
    }

    sb.append(contextPath);
    sb.append("/WEB-INF/classes");

    SPI_CLASS_PATH = sb.toString();

    if (_log.isDebugEnabled()) {
      _log.debug("SPI class path " + SPI_CLASS_PATH);
    }

    String spiProviderClassName = servletContext.getInitParameter("spiProviderClassName");

    Thread currentThread = Thread.currentThread();

    ClassLoader contextClassLoader = currentThread.getContextClassLoader();

    try {
      Class<SPIProvider> spiProviderClass = null;

      if (SPIUtil.isSPI()) {
        spiProviderClass =
            (Class<SPIProvider>) loadClassDirectly(contextClassLoader, spiProviderClassName);
      } else {
        spiProviderClass = (Class<SPIProvider>) contextClassLoader.loadClass(spiProviderClassName);
      }

      SPIProvider spiProvider = spiProviderClass.newInstance();

      boolean result = spiProviderReference.compareAndSet(null, spiProvider);

      if (!result) {
        _log.error(
            "Duplicate SPI provider "
                + spiProvider
                + " is already registered in servlet context "
                + servletContext.getContextPath());
      } else {
        MPIHelperUtil.registerSPIProvider(spiProvider);
      }
    } catch (Exception e) {
      _log.error("Unable to create SPI provider with name " + spiProviderClassName, e);
    }
  }