public void start(String[] args) {
        // construct an application, but don't "start" it yet
        this.app = new LuckPermsApplication(this);

        // create a jar-in-jar classloader for the standalone plugin, then enable it
        // the application is passes to the plugin constructor, to allow it to pass hooks back
        this.loader = new JarInJarClassLoader(getClass().getClassLoader(), JAR_NAME);

        // special case for dependency preload command
        if (args.length == 1 && args[0].equals("preloadDependencies")) {
            try {
                Class<?> clazz = this.loader.loadClass(BOOTSTRAP_DEPENDENCY_PRELOADER_CLASS);
                clazz.getMethod("main").invoke(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }

        this.plugin = this.loader.instantiatePlugin(BOOTSTRAP_PLUGIN_CLASS, LuckPermsApplication.class, this.app);
        this.plugin.onLoad();
        this.plugin.onEnable();

        // start the application
        this.app.start(args);
    }
Loader bootstrap for LuckPerms running as a "standalone" app.

There are three main modules:
1. the loader (this)
     - performs jar-in-jar loading for the plugin
     - starts the application
2. the plugin (LPStandaloneBootstrap, LPStandalonePlugin, etc)
     - implements the standard classes required to create an abstract LuckPerms "plugin")
3. the application
     - allows the user to interact with the plugin through a basic terminal layer
standalone/loader/src/main/java/me/lucko/luckperms/standalone/loader/StandaloneLoader.java