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/PluginsServiceTests.java
@Override
            protected void addServerExportsService(Map<String, List<ModuleQualifiedExportsService>> qualifiedExports) {
                
            }
        };
    }
    static PluginsService newMockPluginsService(List<Class<? extends Plugin>> classpathPlugins) {
        Settings settings = Settings.builder()
            .put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
            .put("my.setting", "test")
            .put(IndexModule.INDEX_STORE_TYPE_SETTING.getKey(), IndexModule.Type.NIOFS.getSettingsKey())
            .build();
        return new MockPluginsService(settings, TestEnvironment.newEnvironment(settings), classpathPlugins);
    }
    
    public void testFilterPlugins() {
        PluginsService service = newMockPluginsService(List.of(FakePlugin.class, FilterablePlugin.class));
        List<ScriptPlugin> scriptPlugins = service.filterPlugins(ScriptPlugin.class);
        assertEquals(1, scriptPlugins.size());
        assertEquals(FilterablePlugin.class, scriptPlugins.get(0).getClass());
    }
    
    public void testMapPlugins() {
        PluginsService service = newMockPluginsService(List.of(FakePlugin.class, FilterablePlugin.class));
        List<String> mapResult = service.map(p -> p.getClass().getSimpleName()).toList();
        assertThat(mapResult, containsInAnyOrder("FakePlugin", "FilterablePlugin"));
        List<String> flatmapResult = service.flatMap(p -> List.of(p.getClass().getSimpleName())).toList();
        assertThat(flatmapResult, containsInAnyOrder("FakePlugin", "FilterablePlugin"));
        List<String> forEachConsumer = new ArrayList<>();
        service.forEach(p -> forEachConsumer.add(p.getClass().getSimpleName()));