0

Im trying to create a plugin system for one of my java project so I was trying to do it with classloader but when I try my method it gives me a ClassNotFound exception. I just can't get it working could someone help me with this? Sorry for my bad english.

my method:

public void loadPlugin(String jarname) throws Exception {
    File f = new File("server'\\" + jarname + ".jar");
    URL url = f.toURL();
    URL[] urls = new URL[]{url};
    URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
    Class classToLoad = Class.forName ("me.daansander.plugin.Plugin", true, child);
    Method method = classToLoad.getDeclaredMethod ("onEnable");
    Object instance = classToLoad.newInstance ();
    Object result = method.invoke (instance);

StackTrace:

java.lang.ClassNotFoundException: me.daansander.plugin.Plugin
    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 java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at me.daansander.serverchecker.plugin.ServerPlugin.loadPlugin(ServerPlug
    in.java:59)
    at me.daansander.serverchecker.plugin.ServerPlugin.start(ServerPlugin.ja
    va:40)
    at me.daansander.serverchecker.ServerChecker.<init>(ServerChecker.java:3
    9)
    at me.daansander.serverchecker.ServerChecker.main(ServerChecker.java:124
    )
Daan Meijer
  • 143
  • 2
  • 12

1 Answers1

1

For Class.forName() to work you'd have to register your new classloader via Thread.currentThread().setContextClassLoader(myClassLoader).

See also https://stackoverflow.com/a/4096399/1015327.

Alternatively, you could try myClassloader.findClass().

Community
  • 1
  • 1
JimmyB
  • 12,101
  • 2
  • 28
  • 44