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
}
    void assertBothDescriptors(Consumer<DescriptorWriter> assertions) {
        assertions.accept(PluginDescriptorTests::mockInternalDescriptor);
        assertions.accept(PluginDescriptorTests::mockStableDescriptor);
    }
    public void testReadInternalDescriptor() throws Exception {
        PluginDescriptor info = mockInternalDescriptor();
        assertEquals("my_plugin", info.getName());
        assertEquals("fake desc", info.getDescription());
        assertEquals("1.0", info.getVersion());
        assertEquals("FakePlugin", info.getClassname());
        assertEquals("org.mymodule", info.getModuleName().orElseThrow());
        assertThat(info.isModular(), is(true));
        assertThat(info.getExtendedPlugins(), empty());
    }
    public void testReadStableDescriptor() throws Exception {
        PluginDescriptor info = mockStableDescriptor();
        assertEquals("my_plugin", info.getName());
        assertEquals("fake desc", info.getDescription());
        assertEquals("1.0", info.getVersion());
        assertThat(info.isModular(), is(true));
    }
    public void testReadFromPropertiesNameMissing() throws Exception {
        assertBothDescriptors(writer -> {
            var e = expectThrows(IllegalArgumentException.class, () -> writer.write("name", null));
            assertThat(e.getMessage(), containsString("property [name] is missing"));
            e = expectThrows(IllegalArgumentException.class, () -> writer.write("name", ""));
            assertThat(e.getMessage(), containsString("property [name] is missing"));
        });
    }