SonarSource/sonarqube · warning

Plugin [ ] is ignored because its base plugin [ ] is not…

Error message

Plugin {} [{}] is ignored because its base plugin [{}] is not installed

What it means

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.

Solutions

  1. Install the base plugin named in the warning (its key appears as the third placeholder) into extensions/plugins and restart the server.
  2. If the child plugin is obsolete/unneeded, remove its JAR from extensions/plugins.
  3. Check plugin compatibility with your SonarQube version; the base plugin may have been merged/renamed in newer versions.
  4. Use the Marketplace (Administration > Marketplace) instead of manual jar copies so dependencies are resolved automatically.
  5. Review the sonar log for further 'required plugin' warnings from the same validator.

Example fix

// before: only the extension jar installed
extensions/plugins/my-lang-linter-plugin.jar
// after: base plugin installed too
extensions/plugins/my-base-plugin.jar
extensions/plugins/my-lang-linter-plugin.jar
Defensive patterns

Strategy: validation

Validate before calling

# before restart, confirm each plugin's base/required plugins are present
for jar in extensions/plugins/*.jar; do
  base=$(unzip -p "$jar" META-INF/MANIFEST.MF | grep -i 'Plugin-Base' | awk '{print $2}')
  if [ -n "$base" ] && ! ls extensions/plugins | grep -qi "${base}"; then
    echo "$jar requires base plugin $base which is missing"
  fi
done

Try / catch

// parse the warning and fail fast in deployment tooling
// log line: Plugin <name> [<key>] is ignored because its base plugin [<base>] is not installed
if (logLine.matches("Plugin .* is ignored because its base plugin .* is not installed")) {
    throw new IllegalStateException("Install the missing base plugin or remove the orphan JAR before restart");
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of SonarSource/sonarqube@184c821202 (2026-09-09). Data as JSON: /api/errors/5452240960477672. Report an issue: GitHub.

Appendix: source

Thrown at server/sonar-server-common/src/main/java/org/sonar/server/plugins/PluginRequirementsValidator.java:69

    var validator = new PluginRequirementsValidator<>(pluginsByKey);
    Set<String> removedKeys = new HashSet<>();
    do {
      removedKeys.clear();
      for (T plugin : pluginsByKey.values()) {
        if (!validator.isCompatible(plugin)) {
          removedKeys.add(plugin.getKey());
        }
      }
      for (String removedKey : removedKeys) {
        pluginsByKey.remove(removedKey);
      }
    } while (!removedKeys.isEmpty());
  }

  boolean isCompatible(T plugin) {
    if (!Strings.isNullOrEmpty(plugin.getBasePlugin()) && !allPluginsByKeys.containsKey(plugin.getBasePlugin())) {
      // it extends a plugin that is not installed
      LOG.warn("Plugin {} [{}] is ignored because its base plugin [{}] is not installed", plugin.getName(), plugin.getKey(), plugin.getBasePlugin());
      return false;
    }

    for (PluginInfo.RequiredPlugin requiredPlugin : plugin.getRequiredPlugins()) {
      PluginInfo installedRequirement = allPluginsByKeys.get(requiredPlugin.getKey());
      if (installedRequirement == null) {
        // it requires a plugin that is not installed
        LOG.warn("Plugin {} [{}] is ignored because the required plugin [{}] is not installed", plugin.getName(), plugin.getKey(), requiredPlugin.getKey());
        return false;
      }
      Version installedRequirementVersion = installedRequirement.getVersion();
      if (installedRequirementVersion != null && requiredPlugin.getMinimalVersion().compareToIgnoreQualifier(installedRequirementVersion) > 0) {
        // it requires a more recent version
        LOG.warn("Plugin {} [{}] is ignored because the version {} of required plugin [{}] is not installed", plugin.getName(), plugin.getKey(),
            requiredPlugin.getMinimalVersion(), requiredPlugin.getKey());
        return false;
      }
    }

View on GitHub (pinned to 184c821202)