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
public void testReadFromPropertiesBadJavaVersionFormat() throws Exception {
        assertBothDescriptors(writer -> {
            var e = expectThrows(IllegalArgumentException.class, () -> writer.write("java.version", "1.7.0_80"));
            assertThat(e.getMessage(), equalTo("Invalid version string: '1.7.0_80'"));
        });
    }
    public void testReadFromPropertiesBogusElasticsearchVersion() throws Exception {
        assertBothDescriptors(writer -> {
            var e = expectThrows(IllegalArgumentException.class, () -> writer.write("elasticsearch.version", "bogus"));
            assertThat(e.getMessage(), containsString("version needs to contain major, minor, and revision"));
        });
    }
    public void testReadFromPropertiesJvmMissingClassname() throws Exception {
        IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> mockInternalDescriptor("classname", null));
        assertThat(e.getMessage(), containsString("property [classname] is missing"));
    }
    public void testReadFromPropertiesModulenameFallback() throws Exception {
        PluginDescriptor info = mockInternalDescriptor("modulename", null);
        assertThat(info.getModuleName().isPresent(), is(false));
        assertThat(info.isModular(), is(false));
        assertThat(info.getExtendedPlugins(), empty());
    }
    public void testReadFromPropertiesModulenameEmpty() throws Exception {
        PluginDescriptor info = mockInternalDescriptor("modulename", " ");
        assertThat(info.getModuleName().isPresent(), is(false));
        assertThat(info.isModular(), is(false));
        assertThat(info.getExtendedPlugins(), empty());
    }
    public void testExtendedPluginsSingleExtension() throws Exception {
        PluginDescriptor info = mockInternalDescriptor("extended.plugins", "foo");