Dependencies
A plugin may depend on classes from other plugins, either bundled, third-party, or by the same author. This document describes the syntax for declaring plugin dependencies and optional plugin dependencies. For more information about dependencies on the Consulo modules, see Part II of this document: Plugin Compatibility with Consulo Products.
NOTE It is impossible to specify the minimum/maximum version for the dependent plugin. (Issue)
To express dependencies on classes from other plugins or modules, perform the following three required steps:
1. Locating Plugin ID and Preparing Sandbox
A compatible version must be chosen carefully according to the plugin's compatibility.
For plugins published on JetBrains Plugins Repository - open plugin's detail page - select Versions tab - open detail page for the desired version, displaying the Compatibility Range and Plugin ID
For bundled and non-public plugins, locate the plugin's main JAR file containing META-INF/plugin.xml
descriptor with <id>
tag (or <name>
if not specified).
If the plugin is not bundled with the target IDE, run the (sandbox) IDE Development Instance of your target IDE and install the plugin there.
2. Project Setup
Depending on the chosen development workflow (Gradle or DevKit), one of the two following steps is necessary.
2.1 Gradle
NOTE Please see the
plugins
attribute gradle-intellij-plugin: Configuration for acceptable values.
If the project uses Gradle with a Groovy build script to build the plugin, add the dependency to the plugins
parameter of the intellij
block in your build.gradle
, for example:
intellij {
plugins 'org.another.plugin:1.0'
}
When using Kotlin build script, use setPlugins()
within the intellij
block, for example:
intellij {
setPlugins("org.another.plugin:1.0")
}
NOTE Transitive dependencies required for tests must currently be specified explicitly.
2.2 DevKit
TIP Existing DevKit-based projects can be converted to use Gradle setup where managing dependencies is fully automated.
If the project uses DevKit, add the JARs of the plugin on which the project depends to the classpath of the Consulo SDK.
WARNING Do not add the plugin JARs as a library: this will fail at runtime because the Consulo will load two separate copies of the dependency plugin classes.
To do that, open the Project Structure dialog, select the SDK used in the project, press the + button in the Classpath tab, and select the plugin JAR file or files:
* For bundled plugins, the plugin JAR files are located in plugins/<pluginname>
or plugins/<pluginname>/lib
under the main installation directory.
If you're not sure which JAR to add, you can add all of them.
* For non-bundled plugins, the plugin JAR files are located in config/plugins/<pluginname>
or config/plugins/<pluginname>/lib
under the directory specified as "Sandbox Home" in the Consulo Plugin SDK settings.
3. Dependency Declaration in plugin.xml
Regardless of whether a plugin project uses Modules Available in All Products, or Modules Specific to Functionality, the correct module must be listed as a dependency in plugin.xml
.
If a project depends on another plugin, the dependency must be declared like a module.
If only general Consulo features (APIs) are used, then a default dependency on com.intellij.modules.platform
must be declared.
To display a list of available Consulo modules, invoke the code completion feature for the <depends>
element contents while editing the plugin project's plugin.xml
file.
3.1 Configuring plugin.xml
In the plugin.xml
, add a <depends>
tag with the dependency plugin's ID as its content.
Continuing with the example from Section 2 above, the dependency declaration in plugin.xml
would be:
<depends>org.another.plugin</depends>
Optional Plugin Dependencies
A project can also specify an optional plugin dependency. In this case, the plugin will load even if the plugin it depends on is not installed or enabled, but part of the plugin's functionality will not be available.
Declare additional optional="true"
and config-file
attribute pointing to optional plugin descriptor file:
<depends optional="true" config-file="myPluginId-optionalPluginName.xml">dependency.plugin.id</depends>
NOTE Additional plugin descriptor files must follow the naming pattern
myPluginId-$NAME$.xml
resulting in unique filenames to prevent problems with classloaders in tests (Details).
For example, if a plugin adds additional highlighting for Java and Kotlin files, use the following setup.
The main plugin.xml
will define an annotator for Java and specify an optional dependency on the Kotlin plugin (org.jetbrains.kotlin
):
plugin.xml
<idea-plugin>
...
<depends optional="true" config-file="myPluginId-withKotlin.xml">org.jetbrains.kotlin</depends>
<extensions defaultExtensionNs="com.intellij">
<annotator language="JAVA" implementationClass="com.example.MyJavaAnnotator"/>
</extensions>
</idea-plugin>
Then create a file called myPluginId-withKotlin.xml
, in the same directory as the main plugin.xml
file.
In that file, define an annotator for Kotlin:
myPluginId-withKotlin.xml
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<annotator language="kotlin" implementationClass="com.example.MyKotlinAnnotator"/>
</extensions>
</idea-plugin>