plugin_class_loaders.md: mention overriding IDE dependency (https://github.com/JetBrains/gradle-intellij-plugin/issues/656)

This commit is contained in:
Yann Cébron 2022-02-07 13:34:31 +01:00
parent 4652b63eaf
commit 41ff7cbefe

View File

@ -5,12 +5,28 @@
A separate class loader is used to load the classes of each plugin.
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 `implementation` scope, replacing `compile` scope.
For this setup to use project defined dependency instead of the bundled IDE version, please add this snippet to your <path>build.gradle.kts</path>:
```kotlin
configurations {
all {
resolutionStrategy.sortArtifacts(ResolutionStrategy.SortOrder.DEPENDENCY_FIRST)
}
}
```
## 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 <path>plugin.xml</path> file, you may use the `<depends>` element to specify that a [plugin depends](plugin_dependencies.md) 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
## Using ServiceLoader
Some libraries use [`ServiceLoader`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/ServiceLoader.html) to detect and load implementations.
For this to work in a plugin, the context class loader must be set to the plugin's classloader and restored afterwards with original one around initialization code: