@Override
    protected void setupPlatformHooks() {
        // inject our own custom permission maps
        Runnable[] injectors = new Runnable[]{
                new InjectorSubscriptionMap(this)::inject,
                new InjectorPermissionMap(this)::inject,
                new InjectorDefaultsMap(this)::inject,
                new PermissibleMonitoringInjector(this, PermissibleMonitoringInjector.Mode.INJECT)
        };

        for (Runnable injector : injectors) {
            injector.run();

            // schedule another injection after all plugins have loaded
            // the entire pluginmanager instance is replaced by some plugins :(
            this.bootstrap.getServer().getScheduler().runTaskLaterAsynchronously(this.bootstrap.getLoader(), injector, 1);
        }

        /*
         * This is an unfortunate solution to a problem which shouldn't even exist. As of Spigot 1.15,
         * the way LP establishes it's load order relative to Vault triggers a dependency warning.
         * This is a workaround to prevent that from showing, since at the moment, there is nothing I
         * can reasonably do to improve this handling in LP without breaking plugins which use/obtain
         * Vault in their onEnable without depending on us.
         *
         * Noteworthy discussion here:
         * - https://github.com/LuckPerms/LuckPerms/issues/1959
         * - https://hub.spigotmc.org/jira/browse/SPIGOT-5546
         * - https://github.com/PaperMC/Paper/pull/3509
         */
        PluginManagerUtil.injectDependency(this.bootstrap.getServer().getPluginManager(), this.bootstrap.getLoader().getName(), "Vault");

        // Provide vault support
        tryVaultHook(false);
    }
LuckPerms implementation for the Bukkit API.
bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java