# Resolve plugins from JetBrains Marketplace in the latest compatible version

**URL:** <https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983>\
**Category:** Gradle Build Scripts\
**Created:** [March 18, 2025, 1:49pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983 "2025-03-18T13:49:36Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![jakub.chrzanowski](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/jakub.chrzanowski/32/38_2.png) [@jakub.chrzanowski](https://platform.jetbrains.com/u/jakub.chrzanowski)\
**Post date:** [March 18, 2025, 1:49pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/1 "2025-03-18T13:49:36Z")

</div>

My colleague asked me if it is possible to resolve plugins from JetBrains Marketplace using the latest available version that matches the currently targeted IntelliJ Platform.  
I know this is a recurring topic, but today I got a pretty neat idea of how to implement it in a Gradle-compatible way – here it is:

```auto
import org.jetbrains.intellij.platform.gradle.extensions.IntelliJPlatformDependenciesExtension
import org.jetbrains.intellij.pluginRepository.PluginRepositoryFactory

val IntelliJPlatformDependenciesExtension.pluginRepository by lazy {
    PluginRepositoryFactory.create("https://plugins.jetbrains.com")
}

fun IntelliJPlatformDependenciesExtension.pluginsInLatestCompatibleVersion(vararg pluginIds: String) =
    plugins(provider {
        pluginIds.map { pluginId ->
            val platformType = intellijPlatform.productInfo.productCode
            val platformVersion = intellijPlatform.productInfo.buildNumber

            val plugin = pluginRepository.pluginManager.searchCompatibleUpdates(
                build = "$platformType-$platformVersion",
                xmlIds = listOf(pluginId),
            ).firstOrNull()
                ?: throw GradleException("No plugin update with id='$pluginId' compatible with '$platformType-$platformVersion' found in JetBrains Marketplace")

            "${plugin.pluginXmlId}:${plugin.version}"
        }
    })

```

And then:

```auto
dependencies {
    // ...

    intellijPlatform {
        // ... 
        pluginsInLatestCompatibleVersion("org.coffeescript", ...)
    }
}

```

Enjoy! 😃

---

<div class="post-metadata">

**Author:** ![chriscarini](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/chriscarini/32/695_2.png) [@chriscarini](https://platform.jetbrains.com/u/chriscarini)\
**Post date:** [March 18, 2025, 1:58pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/2 "2025-03-18T13:58:12Z")

</div>

@jakub.chrzanowski nice! 👏 🎉

Any chance this could be either (a) documented on the SDK site, and/or (b) rolled into the ij gradle plugin 2.\* ? 😊

---

<div class="post-metadata">

**Author:** ![jakub.chrzanowski](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/jakub.chrzanowski/32/38_2.png) [@jakub.chrzanowski](https://platform.jetbrains.com/u/jakub.chrzanowski)\
**Post date:** [March 19, 2025, 12:28pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/3 "2025-03-19T12:28:09Z")

</div>

It’s too tricky to make it a part of the IntelliJ Platform Gradle Plugin, i.e. due to hardcoded hostname, but I’ve added it as a recipe to the docs:

> **[Recipes | IntelliJ Platform Plugin SDK](https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-recipes.html#resolve-plugin-from-jetbrains-marketplace-in-the-latest-compatible-version)**

---

<div class="post-metadata">

**Author:** ![jonathanlermitage.1](https://avatars.discourse-cdn.com/v4/letter/j/e480ec/32.png) [@jonathanlermitage.1](https://platform.jetbrains.com/u/jonathanlermitage.1)\
**Post date:** [March 19, 2025, 7:51pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/4 "2025-03-19T19:51:54Z")

</div>

Just for info, the sample code in this thread works, but the sample code in the [docs](https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-recipes.html#resolve-plugin-from-jetbrains-marketplace-in-the-latest-compatible-version) does not compile:

 ![image](https://us1.discourse-cdn.com/flex001/uploads/jetbrains_platform/original/1X/9f22ed967cbb9a989635c0a444baef5fae337c01.png)

BTW, this code is really useful.  
Now, I can test my plugins with the Classic UI with no efforts. Thanks a lot! 😎

---

<div class="post-metadata">

**Author:** ![jakub.chrzanowski](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/jakub.chrzanowski/32/38_2.png) [@jakub.chrzanowski](https://platform.jetbrains.com/u/jakub.chrzanowski)\
**Post date:** [March 19, 2025, 8:22pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/5 "2025-03-19T20:22:34Z")

</div>

I’m also glad you find this helpful!

And thanks for pointing this out – the code sample in docs will get updated shortly.

---

<div class="post-metadata">

**Author:** ![achapialiou](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/achapialiou/32/306_2.png) [@achapialiou](https://platform.jetbrains.com/u/achapialiou)\
**Post date:** [April 25, 2025, 1:26pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/6 "2025-04-25T13:26:33Z")

</div>

would be really useful to have that logic as part of standard `dependency.intellijPlatform.plugins()`

---

<div class="post-metadata">

**Author:** ![jakub.chrzanowski](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/jakub.chrzanowski/32/38_2.png) [@jakub.chrzanowski](https://platform.jetbrains.com/u/jakub.chrzanowski)\
**Post date:** [April 25, 2025, 1:28pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/7 "2025-04-25T13:28:00Z")

</div>

I implemented that yesterday as a `compatiblePlugin(id)`/`compatiblePlugins(ids)` helper. It should be available with the upcoming IntelliJ Platform Gradle Plugin release.

---

<div class="post-metadata">

**Author:** ![achapialiou](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/achapialiou/32/306_2.png) [@achapialiou](https://platform.jetbrains.com/u/achapialiou)\
**Post date:** [April 25, 2025, 1:33pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/8 "2025-04-25T13:33:47Z")

</div>

How to make it run in runtime? i.e. when

```auto
val runUltimate251 by intellijPlatformTesting.runIde.registering {
    type = IntelliJPlatformType.IntellijIdeaUltimate
    version = "2025.1"
}

```

executing, so it will pick up corespondent plugin’s versions?

---

<div class="post-metadata">

**Author:** ![achapialiou](https://sea1.discourse-cdn.com/flex001/user_avatar/platform.jetbrains.com/achapialiou/32/306_2.png) [@achapialiou](https://platform.jetbrains.com/u/achapialiou)\
**Post date:** [April 25, 2025, 2:20pm UTC](https://platform.jetbrains.com/t/resolve-plugins-from-jetbrains-marketplace-in-the-latest-compatible-version/983/9 "2025-04-25T14:20:39Z")

</div>

Ha, following trick helps:

```kotlin
val pluginRepository: PluginRepository by lazy {
    PluginRepositoryFactory.create("https://plugins.jetbrains.com")
}
fun IntelliJPlatformDependenciesExtension.pluginsInLatestCompatibleVersion() =
    plugins(provider {
        requiredPlugins.addLatestCompatibleVersion(
            platformType = intellijPlatform.productInfo.productCode,
            platformVersion = intellijPlatform.productInfo.buildNumber
        )
    })

private fun List<String>.addLatestCompatibleVersion(platformType: String, platformVersion: String): List<String> =
    map { pluginId ->
        val plugin = pluginRepository.pluginManager.searchCompatibleUpdates(
            build = "$platformType-$platformVersion",
            xmlIds = listOf(pluginId),
        ).firstOrNull()
            ?: throw GradleException("No plugin update with id='$pluginId' compatible with '$platformType-$platformVersion' found in JetBrains Marketplace")

        "${plugin.pluginXmlId}:${plugin.version}"
    }

val requiredPlugins = listOf(
    "PythonCore", // python support (PSI tree)
    "org.intellij.scala",
    "org.jetbrains.plugins.go",
    "PsiViewer",
    // ...
)

dependencies {
    // ...

    intellijPlatform {
        create("IU", "2024.2")
        // ... 
        pluginsInLatestCompatibleVersion()
    }
}

```

and then

```auto
val runUltimate251 by intellijPlatformTesting.runIde.registering {
    type = IntelliJPlatformType.IntellijIdeaUltimate
    version = "2025.1"
    plugins {
        plugins(
            requiredPlugins.addLatestCompatibleVersion(
                platformType = "IU",
                platformVersion = "251.23774.435"
            )
        )
    }
}

```
