Java 9-在运行时动态添加jar

Java 9-在运行时动态添加jar,java,jar,classloader,java-9,urlclassloader,Java,Jar,Classloader,Java 9,Urlclassloader,我在Java9中遇到了一个类加载器问题 此代码适用于以前的Java版本: private static void addNewURL(URL u) throws IOException { final Class[] newParameters = new Class[]{URL.class}; URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Cla

我在Java9中遇到了一个类加载器问题

此代码适用于以前的Java版本:

 private static void addNewURL(URL u) throws IOException {
    final Class[] newParameters = new Class[]{URL.class};
    URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    Class newClass = URLClassLoader.class;
    try {
      Method method = newClass.getDeclaredMethod("addNewURL", newParameters );
      method.setAccessible(true);
      method.invoke(urlClassLoader, new Object[]{u});
    } catch (Throwable t) {
      throw new IOException("Error, could not add URL to system classloader");
    }
  }
从中我了解到,这必须被这样的东西所取代:

Class.forName(classpath, true, loader);

loader = URLClassLoader.newInstance(
            new URL[]{u},
            MyClass.class.getClassLoader()
MyClass
是我试图在中实现
class.forName()
方法的类

u = file:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar

String classpath = URLClassLoader.getSystemResource("plugins/myNodes/myOwn-nodes-1.6.jar").toString();
出于某种原因-我真的不明白,为什么-当运行
Class.forName(classpath,true,loader)时,我得到一个ClassNotFoundException


有人知道我做错了什么吗

来自以下文件:-

如果指定的类加载器无法定位该类,则引发
ClassNotFoundException

另外,请注意,API使用的参数包括类的名称,类加载器使用该名称返回类的对象

给定类或接口的完全限定名(与getName返回的格式相同),此方法尝试定位、加载和链接该类或接口

在示例代码中,可以将其更正为:

// Constructing a URL form the path to JAR
URL u = new URL("file:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar");

// Creating an instance of URLClassloader using the above URL and parent classloader 
ClassLoader loader = URLClassLoader.newInstance(new URL[]{u}, MyClass.class.getClassLoader());

// Returns the class object
Class<?> yourMainClass = Class.forName("MainClassOfJar", true, loader);
//从JAR路径构造URL
URL u=newURL(“文件:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar”);
//使用上述URL和父类加载器创建URLClassloader的实例
ClassLoader=URLClassLoader.newInstance(新URL[]{u},MyClass.class.getClassLoader());
//返回类对象
Class yourMainClass=Class.forName(“MainClassOfJar”,true,loader);

其中,上述代码中的
MainClassOfJar
应替换为JAR的主类myOwn-nodes-1.6。JAR

class.forName采用类名,而不是类路径。