Class WebappLoader

All Implemented Interfaces:
PropertyChangeListener, EventListener, MBeanRegistration, JmxEnabled, Lifecycle, Loader

public class WebappLoader extends LifecycleMBeanBase implements Loader, PropertyChangeListener
Classloader implementation which is specialized for handling web applications in the most efficient way, while being Catalina aware (all accesses to resources are made through WebResourceRoot). This class loader supports detection of modified Java classes, which can be used to implement auto-reload support.

This class loader is configured via the Resources children of its Context prior to calling start(). When a new class is required, these Resources will be consulted first to locate the class. If it is not present, the system class loader will be used instead.

Author:
Craig R. McClanahan, Remy Maucherat
  • Field Details

    • sm

      protected static final StringManager sm
      The string manager for this package.
    • support

      protected final PropertyChangeSupport support
      The property change support for this component.
  • Constructor Details

    • WebappLoader

      public WebappLoader()
      Construct a new WebappLoader. The parent class loader will be defined by Container.getParentClassLoader().
    • WebappLoader

      @Deprecated public WebappLoader(ClassLoader parent)
      Deprecated.
      Use Container.setParentClassLoader(ClassLoader) to specify the required class loader. This method will be removed in Tomcat 10 onwards.
      Construct a new WebappLoader with the specified class loader to be defined as the parent of the ClassLoader we ultimately create.
      Parameters:
      parent - The parent class loader
  • Method Details

    • getClassLoader

      public ClassLoader getClassLoader()
      Specified by:
      getClassLoader in interface Loader
      Returns:
      the Java class loader to be used by this Loader.
    • getContext

      public Context getContext()
      Specified by:
      getContext in interface Loader
      Returns:
      the Context with which this Loader has been associated.
    • setContext

      public void setContext(Context context)
      Description copied from interface: Loader
      Set the Context with which this Loader has been associated.
      Specified by:
      setContext in interface Loader
      Parameters:
      context - The associated Context
    • getDelegate

      public boolean getDelegate()
      Specified by:
      getDelegate in interface Loader
      Returns:
      the "follow standard delegation model" flag used to configure our ClassLoader.
    • setDelegate

      public void setDelegate(boolean delegate)
      Description copied from interface: Loader
      Set the "follow standard delegation model" flag used to configure our ClassLoader.
      Specified by:
      setDelegate in interface Loader
      Parameters:
      delegate - The new flag
    • getLoaderClass

      public String getLoaderClass()
      Returns:
      the ClassLoader class name.
    • setLoaderClass

      public void setLoaderClass(String loaderClass)
      Set the ClassLoader class name.
      Parameters:
      loaderClass - The new ClassLoader class name
    • setLoaderInstance

      public void setLoaderInstance(WebappClassLoaderBase loaderInstance)
      Set the ClassLoader instance, without relying on reflection This method will also invoke setLoaderClass(String) with loaderInstance.getClass().getName() as an argument
      Parameters:
      loaderInstance - The new ClassLoader instance to use
    • getReloadable

      public boolean getReloadable()
      Return the reloadable flag for this Loader.
      Specified by:
      getReloadable in interface Loader
      Returns:
      the reloadable flag for this Loader.
    • setReloadable

      public void setReloadable(boolean reloadable)
      Set the reloadable flag for this Loader.
      Specified by:
      setReloadable in interface Loader
      Parameters:
      reloadable - The new reloadable flag
    • addPropertyChangeListener

      public void addPropertyChangeListener(PropertyChangeListener listener)
      Description copied from interface: Loader
      Add a property change listener to this component.
      Specified by:
      addPropertyChangeListener in interface Loader
      Parameters:
      listener - The listener to add
    • backgroundProcess

      public void backgroundProcess()
      Description copied from interface: Loader
      Execute a periodic task, such as reloading, etc. This method will be invoked inside the classloading context of this container. Unexpected throwables will be caught and logged.
      Specified by:
      backgroundProcess in interface Loader
    • getLoaderRepositories

      public String[] getLoaderRepositories()
    • getLoaderRepositoriesString

      public String getLoaderRepositoriesString()
    • getClasspath

      public String getClasspath()
      Classpath, as set in org.apache.catalina.jsp_classpath context property
      Returns:
      The classpath
    • modified

      public boolean modified()
      Description copied from interface: Loader
      Has the internal repository associated with this Loader been modified, such that the loaded classes should be reloaded?
      Specified by:
      modified in interface Loader
      Returns:
      true when the repository has been modified, false otherwise
    • removePropertyChangeListener

      public void removePropertyChangeListener(PropertyChangeListener listener)
      Description copied from interface: Loader
      Remove a property change listener from this component.
      Specified by:
      removePropertyChangeListener in interface Loader
      Parameters:
      listener - The listener to remove
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • startInternal

      protected void startInternal() throws LifecycleException
      Start associated ClassLoader and implement the requirements of LifecycleBase.startInternal().
      Specified by:
      startInternal in class LifecycleBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • stopInternal

      protected void stopInternal() throws LifecycleException
      Stop associated ClassLoader and implement the requirements of LifecycleBase.stopInternal().
      Specified by:
      stopInternal in class LifecycleBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • propertyChange

      public void propertyChange(PropertyChangeEvent event)
      Process property change events from our associated Context.
      Specified by:
      propertyChange in interface PropertyChangeListener
      Parameters:
      event - The property change event that has occurred
    • getDomainInternal

      protected String getDomainInternal()
      Description copied from class: LifecycleMBeanBase
      Method implemented by sub-classes to identify the domain in which MBeans should be registered.
      Specified by:
      getDomainInternal in class LifecycleMBeanBase
      Returns:
      The name of the domain to use to register MBeans.
    • getObjectNameKeyProperties

      protected String getObjectNameKeyProperties()
      Description copied from class: LifecycleMBeanBase
      Allow sub-classes to specify the key properties component of the ObjectName that will be used to register this component.
      Specified by:
      getObjectNameKeyProperties in class LifecycleMBeanBase
      Returns:
      The string representation of the key properties component of the desired ObjectName