IntelliJ Platform Plugin SDK Help

Components (Deprecated)

Plugin Components are a legacy feature supported for compatibility with plugins created for older versions of the IntelliJ Platform. Plugins using Components do not support dynamic loading (the ability to install, update, and uninstall plugins without restarting the IDE).

Plugin Components are defined in the <application-components>, <project-components>, and <module-components> sections in a Plugin Configuration File.


To migrate existing code from Components to modern APIs, see the following guidelines.

Manage State

To manage some state or logic that is only needed when the user performs a specific operation, use a Service.

Persisting State

To store the state of your plugin at the application or project level, use a Service, and implement the PersistentStateComponent interface. See Persisting State of Components for details.

Subscribing to Events

To subscribe to events, use a listener or create an extension for a dedicated extension point (for example, com.intellij.editorFactoryListener) if one exists for the event to subscribe to.

Application Startup

Plugin code should only be executed when projects are opened (see Project Open) or when the user invokes an action of a plugin. If this cannot be avoided, add a listener subscribing to the AppLifecycleListener topic. See also Running Tasks Once.

Project Open

Using Kotlin Coroutines, implement ProjectActivity and register in com.intellij.postStartupActivity extension point.

Implementation in Kotlin is required because Java doesn't support suspending functions.

To execute code when a project is being opened, use one of these two extensions:


StartupActivity for immediate execution on EDT. Implement DumbAware to indicate activity can run in background thread (in parallel with other such tasks).


StartupActivity.Background for execution with a 5-second delay in background thread (2019.3 or later).

Any long-running or CPU intensive tasks should be made visible to users by using Access to indexes must be wrapped with DumbService, see also General Threading Rules.

See also Running Tasks Once.

Project and Application Close

To execute code on project closing or application shutdown, implement the Disposable interface in a Service and place the code in the dispose() method. Alternatively, use Disposer.register() passing a Project or Application service instance as the parent argument (see Choosing a Disposable Parent).

Last modified: 13 July 2024