{"record":{"id":"47cbbcee210333b8","repo":"SonarSource/sonarqube","slug":"plugin-is-ignored-because-the-required-plu","errorCode":null,"errorMessage":"Plugin {} [{}] is ignored because the required plugin [{}] is not installed","messagePattern":"Plugin (.+?) \\[(.+?)\\] is ignored because the required plugin \\[(.+?)\\] is not installed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"server/sonar-server-common/src/main/java/org/sonar/server/plugins/PluginRequirementsValidator.java","lineNumber":77,"sourceCode":"      }\n      for (String removedKey : removedKeys) {\n        pluginsByKey.remove(removedKey);\n      }\n    } while (!removedKeys.isEmpty());\n  }\n\n  boolean isCompatible(T plugin) {\n    if (!Strings.isNullOrEmpty(plugin.getBasePlugin()) && !allPluginsByKeys.containsKey(plugin.getBasePlugin())) {\n      // it extends a plugin that is not installed\n      LOG.warn(\"Plugin {} [{}] is ignored because its base plugin [{}] is not installed\", plugin.getName(), plugin.getKey(), plugin.getBasePlugin());\n      return false;\n    }\n\n    for (PluginInfo.RequiredPlugin requiredPlugin : plugin.getRequiredPlugins()) {\n      PluginInfo installedRequirement = allPluginsByKeys.get(requiredPlugin.getKey());\n      if (installedRequirement == null) {\n        // it requires a plugin that is not installed\n        LOG.warn(\"Plugin {} [{}] is ignored because the required plugin [{}] is not installed\", plugin.getName(), plugin.getKey(), requiredPlugin.getKey());\n        return false;\n      }\n      Version installedRequirementVersion = installedRequirement.getVersion();\n      if (installedRequirementVersion != null && requiredPlugin.getMinimalVersion().compareToIgnoreQualifier(installedRequirementVersion) > 0) {\n        // it requires a more recent version\n        LOG.warn(\"Plugin {} [{}] is ignored because the version {} of required plugin [{}] is not installed\", plugin.getName(), plugin.getKey(),\n            requiredPlugin.getMinimalVersion(), requiredPlugin.getKey());\n        return false;\n      }\n    }\n    return true;\n  }\n\n}\n","sourceCodeStart":59,"sourceCodeEnd":92,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-server-common/src/main/java/org/sonar/server/plugins/PluginRequirementsValidator.java#L59-L92","documentation":"PluginRequirementsValidator.isCompatible logs this warning and returns false when a plugin declares a requiredPlugin whose key is not present in the set of installed plugins. SonarQube then ignores (does not load) the plugin, because its dependency cannot be satisfied. It is a validation gate at server startup to prevent loading plugins with unmet dependencies.","triggerScenarios":"A plugin's manifest/plugin.properties declares 'requiredPlugin-<key>' for a plugin that is not installed in the SonarQube extensions/plugins directory when isCompatible runs during startup or plugin refresh.","commonSituations":"Installing a plugin A that depends on plugin B but forgetting to download/install B; uninstalling B while leaving A installed; a renamed or deprecated dependency plugin (key changed between SonarQube versions); plugin packaged with wrong dependency key.","solutions":["Install the missing required plugin (matching key from the warning) into extensions/plugins and restart the server","Remove or upgrade the dependent plugin so it no longer requires the absent plugin","Check the plugin documentation for its dependency and correct the requiredPlugin key in plugin.properties if it was hand-edited","Upgrade SonarQube/plugin versions so the dependency key matches the currently shipped plugin keys"],"exampleFix":"# before\nextensions/plugins/my-plugin-1.0.jar   # requires 'sonar-findbugs' not installed\n# after\nextensions/plugins/my-plugin-1.0.jar\nextensions/plugins/sonar-findbugs-plugin-4.2.4.jar  # dependency installed","handlingStrategy":"validation","validationCode":"Set<String> installedKeys = installedPlugins.stream().map(PluginInfo::getKey).collect(toSet());\nList<String> missing = plugin.getRequiredPlugins().stream()\n  .map(PluginInfo.RequiredPlugin::getKey)\n  .filter(k -> !installedKeys.contains(k))\n  .collect(toSet());\nif (!missing.isEmpty()) throw new IllegalStateException(\"Missing required plugins: \" + missing);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always install a plugin together with its documented required plugins","After removing a plugin, scan logs for dependents and remove/upgrade them too","Version-check plugin sets in your provisioning script before copying to extensions/plugins"],"tags":["plugins","sonarqube","startup","dependency"],"backgroundTag":"missing-dependency","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}