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
}
    /**
     * The module name of the plugin.
     *
     * @return the module name of the plugin
     */
    public Optional<String> getModuleName() {
        return Optional.ofNullable(moduleName);
    }
    /**
     * Other plugins this plugin extends through SPI.
     *
     * @return the names of the plugins extended
     */
    public List<String> getExtendedPlugins() {
        return extendedPlugins;
    }
    /**
     * The version of the plugin
     *
     * @return the version
     */
    public String getVersion() {
        return version;
    }
    /**
     * The version of Elasticsearch the plugin was built for.
     *
     * @return an Elasticsearch version
     */