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
- 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.
- Rebuild/re-download the plugin from an official release so it includes the correct manifest entry point.
- 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
- Only place official plugin artifacts in extensions/plugins, never bare dependency jars
- Validate plugin packaging (manifest entry point) before deployment
- Re-download plugins from official releases rather than copying from old servers
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
- ############################################################…
- Plugin [ ] is blacklisted and is being uninstalled
- Plugin [ ] is ignored because its base plugin [ ] 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/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)