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/test/java/org/elasticsearch/plugins/PluginDescriptorTests.java
assertThat(info.getExtendedPlugins(), contains("foo"));
    }
    public void testExtendedPluginsMultipleExtensions() throws Exception {
        PluginDescriptor info = mockInternalDescriptor("extended.plugins", "foo,bar,baz");
        assertThat(info.getExtendedPlugins(), contains("foo", "bar", "baz"));
    }
    public void testExtendedPluginsEmpty() throws Exception {
        PluginDescriptor info = mockInternalDescriptor("extended.plugins", "");
        assertThat(info.getExtendedPlugins(), empty());
    }
    public void testIsModular() throws Exception {
        PluginDescriptor info = mockStableDescriptor("modular", "false");
        assertThat(info.isModular(), is(false));
    }
    public void testSerialize() throws Exception {
        PluginDescriptor info = new PluginDescriptor(
            "c",
            "foo",
            "dummy",
            Version.CURRENT,
            "1.8",
            "dummyclass",
            null,
            Collections.singletonList("foo"),
            randomBoolean(),
            randomBoolean(),
            randomBoolean(),
            randomBoolean()
        );
        BytesStreamOutput output = new BytesStreamOutput();