SonarSource/sonarqube · warning

Plugin [ ] is ignored because entry point class is not…

Error message

Plugin {} [{}] is ignored because entry point class is not defined

What it means

PluginJarLoader skips any plugin JAR that defines neither a main entry-point class (Main-Class style attribute) nor a basePlugin it extends. Such a JAR is not a loadable SonarQube plugin, so the loader logs this warning and ignores the file.

Solutions

  1. Remove the non-plugin JAR from extensions/plugins; if it is a shared library, place it in the plugin's lib directory or bundle it inside the plugin.
  2. Rebuild/re-download the plugin from an official release so it includes the correct manifest entry point.
  3. Verify with `jar tf plugin.jar` and the manifest that the Plugin-Class/main class attribute is present.

Example fix

// before (wrong packaging)
lib/my-utils.jar -> extensions/plugins/my-utils.jar
// after
extensions/plugins/my-plugin.jar (with sonar-plugin manifest entry point)
lib/my-utils.jar kept as plugin dependency inside my-plugin.jar
Defensive patterns

Strategy: validation

Validate before calling

// verify a jar is a valid sonar plugin before copying to extensions/plugins
unzip -p plugin.jar META-INF/MANIFEST.MF | grep -E 'Plugin-Class|Sonar-Plugin'

Prevention

When it happens

Trigger: Server startup when a JAR in the plugins directory has both info.getMainClass() and info.getBasePlugin() null/empty (Strings.isNullOrEmpty), causing checkPluginInfo to return false and skip the JAR.

Common situations: Accidentally dropping a plain library JAR (dependency JAR) into extensions/plugins; a corrupted or mis-packaged plugin missing its Plugin class manifest entry.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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

Appendix: source

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

      .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()) {
      return FileUtils.listFiles(dir, new String[] {"jar"}, false);
    }
    return Collections.emptyList();
  }

}

View on GitHub (pinned to 184c821202)