We pass `null` for the class name here:

https://github.com/elastic/elasticsearch/blob/f086dd18ddc705bf84a1ff99d35196ec2498fd52/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java#L261

However the class name is mandatory for the transport protocol today:

https://github.com/elastic/elasticsearch/blob/f086dd18ddc705bf84a1ff99d35196ec2498fd52/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java#L156

This prevents various APIs from working in a cluster with stable plugins installed.
server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java
PluginDescriptor that = (PluginDescriptor) o;
        return Objects.equals(name, that.name);
    }
    @Override
    public int hashCode() {
        return name.hashCode();
    }
    @Override
    public String toString() {
        return toString("");
    }
    public String toString(String prefix) {
        final List<String> lines = new ArrayList<>();
        appendLine(lines, prefix, "- Plugin information:", "");
        appendLine(lines, prefix, "Name: ", name);
        appendLine(lines, prefix, "Description: ", description);
        appendLine(lines, prefix, "Version: ", version);
        appendLine(lines, prefix, "Elasticsearch Version: ", elasticsearchVersion);
        appendLine(lines, prefix, "Java Version: ", javaVersion);
        appendLine(lines, prefix, "Native Controller: ", hasNativeController);
        appendLine(lines, prefix, "Licensed: ", isLicensed);
        appendLine(lines, prefix, "Extended Plugins: ", extendedPlugins.toString());
        appendLine(lines, prefix, " * Classname: ", classname);
        return String.join(System.lineSeparator(), lines);
    }
    private static void appendLine(List<String> builder, String prefix, String field, Object value) {
        builder.add(prefix + field + value);
    }
}