Lib Directories and Directives

Here we describe two simple and effective methods to make the .jar files for Solr plugins visible to Solr.

Such files are sometimes called "libraries" or "libs" for short. Essentially you can put them in some special places or explicitly tell Solr about them from your config.

If there is overlap or inter-dependencies between libraries, then pay attention to the order. You can think of it like a stack that is searched top-down. At the top are the lib directives in reverse order, then Solr core’s lib, then Solr home’s lib, then Solr itself.

Lib Directories

There are several special places you can place Solr plugin .jar files:

  • <solr_home>/lib/: The .jar files placed here are available to all Solr cores running on the node, and to node level plugins referenced in solr.xml — so basically everything. This directory is not present by default so create it. See Taking Solr to Production.

  • <core_instance>/lib/: In a user-managed cluster or a single-node installation, you may want to add plugins just for a specific Solr core. Create this adjacent to the conf/ directory; it’s not present by default.

  • <solr_install>/server/solr-webapp/webapp/WEB-INF/lib/: The .jar files for Solr itself and it’s dependencies live here. Certain plugins or add-ons to plugins require placement here. They will document themselves to say so.

  • <solr_install>/server/lib/ext: The .jar files used for the Solr server as well as Solr Core/SolrJ.

Solr incorporates Jetty for providing HTTP server functionality. Jetty has some directories that contain .jar files for itself and its own plugins / modules or JVM level plugins (e.g., loggers). Solr plugins won’t work in these locations.

Lib Directives in SolrConfig

Both plugin and resource file paths are configurable via <lib/> directives in solrconfig.xml. When a directive matches a directory, then resources can be resolved from it. When a directive matches a .jar file, Solr plugins and their dependencies are resolved from it. Resources can be placed in a .jar too but that’s unusual. It’s erroneous to refer to any other type of file.

A <lib/> directive must have one (not both) of these two attributes:

  • path: used to refer to a single directory (for resources) or file (for a plugin .jar)

  • dir: used to refer to all direct descendants of the specified directory. Optionally supply a regex attribute to filter these to those matching the regular expression.

All directories are resolved as relative to the Solr core’s instanceDir.

These examples show how to load modules into Solr:

  <lib dir="${solr.install.dir:../../../..}/modules/extraction/lib" regex=".*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/modules/clustering/lib/" regex=".*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/modules/langid/lib/" regex=".*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/modules/ltr/lib/" regex=".*\.jar" />