{"record":{"id":"5452240960477672","repo":"SonarSource/sonarqube","slug":"plugin-is-ignored-because-its-base-plugin","errorCode":null,"errorMessage":"Plugin {} [{}] is ignored because its base plugin [{}] is not installed","messagePattern":"Plugin (.+?) \\[(.+?)\\] is ignored because its base 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":69,"sourceCode":"    var validator = new PluginRequirementsValidator<>(pluginsByKey);\n    Set<String> removedKeys = new HashSet<>();\n    do {\n      removedKeys.clear();\n      for (T plugin : pluginsByKey.values()) {\n        if (!validator.isCompatible(plugin)) {\n          removedKeys.add(plugin.getKey());\n        }\n      }\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    }","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-server-common/src/main/java/org/sonar/server/plugins/PluginRequirementsValidator.java#L51-L87","documentation":"SonarQube plugins can declare a 'base plugin' they extend, plus required plugins. During PluginRequirementsValidator compatibility checks, if a plugin's basePlugin is not among the installed plugins, the plugin is skipped and this warning is logged. The child plugin will not be loaded at all.","triggerScenarios":"Installing a plugin JAR whose manifest declares a base plugin (or required plugin) key that is not present in the plugins directory — e.g. dropping only the child/extension plugin into extensions/plugins.","commonSituations":"Installing a language linter extension without its parent plugin; upgrading SonarQube where the base plugin was renamed/removed but the child plugin JAR was left behind; manually copying plugin jars without their dependencies.","solutions":["Install the base plugin named in the warning (its key appears as the third placeholder) into extensions/plugins and restart the server.","If the child plugin is obsolete/unneeded, remove its JAR from extensions/plugins.","Check plugin compatibility with your SonarQube version; the base plugin may have been merged/renamed in newer versions.","Use the Marketplace (Administration > Marketplace) instead of manual jar copies so dependencies are resolved automatically.","Review the sonar log for further 'required plugin' warnings from the same validator."],"exampleFix":"// before: only the extension jar installed\nextensions/plugins/my-lang-linter-plugin.jar\n// after: base plugin installed too\nextensions/plugins/my-base-plugin.jar\nextensions/plugins/my-lang-linter-plugin.jar","handlingStrategy":"validation","validationCode":"# before restart, confirm each plugin's base/required plugins are present\nfor jar in extensions/plugins/*.jar; do\n  base=$(unzip -p \"$jar\" META-INF/MANIFEST.MF | grep -i 'Plugin-Base' | awk '{print $2}')\n  if [ -n \"$base\" ] && ! ls extensions/plugins | grep -qi \"${base}\"; then\n    echo \"$jar requires base plugin $base which is missing\"\n  fi\ndone","typeGuard":null,"tryCatchPattern":"// parse the warning and fail fast in deployment tooling\n// log line: Plugin <name> [<key>] is ignored because its base plugin [<base>] is not installed\nif (logLine.matches(\"Plugin .* is ignored because its base plugin .* is not installed\")) {\n    throw new IllegalStateException(\"Install the missing base plugin or remove the orphan JAR before restart\");\n}","preventionTips":["Install plugins via the Marketplace so dependencies resolve automatically.","When upgrading SonarQube, audit extensions/plugins for orphaned child plugins.","Read MANIFEST.Sonar-Plugin / Plugin-Base headers of custom plugins.","Keep a curated list of installed plugins under version control.","Remove deprecated plugin JARs after version upgrades."],"tags":["sonarqube","plugins","dependencies","startup"],"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"}