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
- 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.
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
- 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.
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
- ############################################################…
- Plugin [ ] is blacklisted and is being uninstalled
- Plugin [ ] is ignored because entry point class is not…
- Plugin [ ] is ignored because the required plugin [ ] is…
- Plugin(s) detected. Plugins are not provided by SonarSource…
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)