Загрузить файл JAR с URLCLassLoader

Я пытаюсь загрузить файл jar, как если бы он был запущен с помощью "java -jar BungeeCord.jar", но я пытаюсь сделать это из другого jar. Я не могу использовать построитель процессов, потому что мне нужно получить экземпляр классов, используемых во внешнем файле jar.

Я создал это:

System.out.println("Loading jar: " + jar.toURI().toURL());

    child = new URLClassLoader(new URL[]{jar.toURI().toURL()}, BungeeServer.class.getClassLoader());

    Class<?> classToLoad = Class.forName("net.md_5.bungee.Bootstrap", true, child);
    final Method method = classToLoad.getDeclaredMethod("main", String[].class);

    new Thread(new Runnable(){

        public void run() {
            try {
                method.invoke(null, (Object) new String[]{});
            } catch (Exception e) {
                e.printStackTrace();
                BungeeControl.shutdown();
            }
        }

    }).start();

Это запускает JAR-файл, но примерно дюжину раз при запуске выдает следующую ошибку, которая не возникает, если я обычно запускаю тот же файл:

java.lang.NoClassDefFoundError: net/md_5/bungee/api/plugin/Plugin
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at net.md_5.bungee.api.plugin.PluginClassloader.loadClass0(PluginClassloader.java:34)
    at net.md_5.bungee.api.plugin.PluginClassloader.loadClass(PluginClassloader.java:27)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at net.md_5.bungee.api.plugin.PluginManager.enablePlugin(PluginManager.java:304)
    at net.md_5.bungee.api.plugin.PluginManager.loadPlugins(PluginManager.java:212)
    at net.md_5.bungee.BungeeCord.start(BungeeCord.java:264)
    at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:55)
    at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.moltrespvp.bungeecontrol.BungeeServer$1.run(BungeeServer.java:31)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: net.md_5.bungee.api.plugin.Plugin
    at net.md_5.bungee.api.plugin.PluginClassloader.loadClass0(PluginClassloader.java:53)
    at net.md_5.bungee.api.plugin.PluginClassloader.loadClass(PluginClassloader.java:27)
    at java.lang.ClassLoader.loadClass(Unknown Source)

Если необходимо, вот манифест для Bungeecord:

Manifest-Version: 1.0
Implementation-Version: git:BungeeCord-Bootstrap:1.12-SNAPSHOT:16d2615
 :1233
Archiver-Version: Plexus Archiver
Built-By: jenkins
Created-By: Apache Maven 3.2.5
Build-Jdk: 1.8.0_121
Specification-Version: 20170514
Main-Class: net.md_5.bungee.Bootstrap

Как я могу запустить этот файл JAR, как будто я запустил его с ProcessBuilder, но иметь возможность доступа к методам из запущенного экземпляра.

Например, мне нужно иметь возможность запустить это для работающего экземпляра BungeeCord ProxyServer.getInstance()?

0 ответов

Другие вопросы по тегам