SonarSource/sonarqube · warning

Plugin [ ] is blacklisted and is being uninstalled

Error message

Plugin {} [{}] is blacklisted and is being uninstalled

What it means

PluginJarLoader.checkPluginInfo validates each plugin JAR at startup against a list of blacklisted plugin keys. If a plugin's key is blacklisted, SonarQube logs this warning and deletes the plugin JAR file, refusing to load it.

Solutions

  1. Remove the blacklisted plugin JAR from extensions/plugins and restart the server.
  2. Check SonarQube release notes for the blacklisted key and install the fixed/supported plugin version instead.
  3. If you believe the blacklist is wrong, verify the plugin's sonar-plugin key in its MANIFEST/properties matches what you expect.
Defensive patterns

Strategy: validation

Validate before calling

// before deploying a plugin, verify it is not blacklisted by checking
// the SonarQube version release notes for the plugin key
String key = pluginInfo.getKey();
if (KNOWN_BLACKLISTED_KEYS.contains(key)) { System.out.println("Do not install: " + key); }

Prevention

When it happens

Trigger: Server startup when a plugin JAR in extensions/plugins has a key present in blacklistedPluginKeys; the loader logs the warning with the plugin name and key, deletes info.getNonNullJarFile(), and skips loading it.

Common situations: Installing a plugin version that SonarSource has blacklisted for known bugs or security issues (e.g. vulnerable or broken releases of popular community plugins); upgrading SonarQube while an old incompatible plugin remains.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at server/sonar-webserver-api/src/main/java/org/sonar/server/plugins/PluginJarLoader.java:203

  private static void failIfContainsIncompatiblePlugins(List<? extends PluginInfo> plugins) {
    List<String> incompatiblePlugins = plugins.stream()
      .filter(p -> FORBIDDEN_INCOMPATIBLE_PLUGINS.contains(p.getKey()))
      .map(p -> "'" + p.getKey() + "'")
      .sorted()
      .toList();

    if (!incompatiblePlugins.isEmpty()) {
      logGenericPluginLoadErrorLog();
      throw MessageException.of(String.format("The following %s no longer compatible with this version of SonarQube: %s",
        incompatiblePlugins.size() > 1 ? "plugins are" : "plugin is", String.join(", ", incompatiblePlugins)));
    }
  }

  private boolean checkPluginInfo(PluginInfo info) {
    String pluginKey = info.getKey();
    if (blacklistedPluginKeys.contains(pluginKey)) {
      LOG.warn("Plugin {} [{}] is blacklisted and is being uninstalled", info.getName(), pluginKey);
      deleteQuietly(info.getNonNullJarFile());
      return false;
    }

    if (Strings.isNullOrEmpty(info.getMainClass()) && Strings.isNullOrEmpty(info.getBasePlugin())) {
      LOG.warn("Plugin {} [{}] is ignored because entry point class is not defined", info.getName(), info.getKey());
      return false;
    }

    if (!info.isCompatibleWith(sonarRuntime.getApiVersion().toString())) {
      throw MessageException.of(format("Plugin %s [%s] requires at least Sonar Plugin API version %s (current: %s)",
        info.getName(), info.getKey(), info.getMinimalSonarPluginApiVersion(), sonarRuntime.getApiVersion()));
    }
    return true;
  }

  private static Collection<File> listJarFiles(File dir) {
    if (dir.exists()) {

View on GitHub (pinned to 184c821202)