Class Loaders
Each plugin has a dedicated class loader, which is used to load the plugin's classes. This allows each plugin to use a different library version, even if the same library is used by the IDE itself or by another plugin.
Overriding IDE Dependencies
Gradle 7 introduced the implementation scope that replaced the compile scope. For this setup, to use a library dependency declared by a plugin instead of the version bundled in the IDE, add the following snippet to the Gradle build script:
Loading Classes from Plugin Dependencies
By default, the main IDE class loader loads classes that are not found in the plugin class loader. However, in the plugin.xml file, use the <depends> element to specify that a plugin depends on one or more other plugins. In this case, the class loaders of those plugins will be used for classes not found in the current plugin. This allows a plugin to reference classes from other plugins.
Using ServiceLoader
Some libraries use ServiceLoader to detect and load implementations. To make it work in a plugin, the context class loader must be set to the plugin's classloader and restored afterward with the original one around initialization code: