Java 如何从一个目录中动态加载所有JAR?

Java 如何从一个目录中动态加载所有JAR?,java,eclipse-plugin,osgi,urlclassloader,Java,Eclipse Plugin,Osgi,Urlclassloader,嗨,我正在创建一个插件,它需要动态加载JAR并访问这些JAR的类和方法。我尝试使用URLClassLoader,并能够加载如下所示的类 URL myJarFile = new URL("jar","","file:"+jarPath); URLClassLoader sysLoader =(URLClassLoader)ClassLoader.getSystemClassLoader(); Class sysClass = URLClassLoader.class; Method sysMeth

嗨,我正在创建一个插件,它需要动态加载JAR并访问这些JAR的类和方法。我尝试使用URLClassLoader,并能够加载如下所示的类

URL myJarFile = new URL("jar","","file:"+jarPath);
URLClassLoader sysLoader =(URLClassLoader)ClassLoader.getSystemClassLoader();
Class sysClass = URLClassLoader.class;
Method sysMethod = sysClass.getDeclaredMethod("addURL", new Class[]{URL.class});
sysMethod.setAccessible(true);
sysMethod.invoke(sysLoader, new Object[]{myJarFile});
但问题是,我们必须通过单独指定类的名称将类加载到类加载器中。
我想要的是从类路径中的所有jar加载所有类,并在任何时间点访问它们

可以使用URLClassLoader吗?如果没有,还有什么其他选择? OSGI在实现这一目标方面有多大帮助


提前谢谢

您需要首先加载jar,然后从那里加载所需的类

URL myJarFile = new URL("jar","","file:"+jarPath);
URLClassLoader child = new URLClassLoader (myJarFile , this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);
然后,您可以首先获得jar文件中所有类的列表:

List<String> classNames=new ArrayList<String>();
ZipInputStream zip=new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for(ZipEntry entry=zip.getNextEntry();entry!=null;entry=zip.getNextEntry())
    if(entry.getName().endsWith(".class") && !entry.isDirectory()) {
        StringBuilder className=new StringBuilder();
        for(String part : entry.getName().split("/")) {
            if(className.length() != 0)
                className.append(".");
            className.append(part);
            if(part.endsWith(".class"))
                className.setLength(className.length()-".class".length());
        }
        classNames.add(className.toString());
    }

您需要首先加载jar,然后从那里加载所需的类

URL myJarFile = new URL("jar","","file:"+jarPath);
URLClassLoader child = new URLClassLoader (myJarFile , this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);
然后,您可以首先获得jar文件中所有类的列表:

List<String> classNames=new ArrayList<String>();
ZipInputStream zip=new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for(ZipEntry entry=zip.getNextEntry();entry!=null;entry=zip.getNextEntry())
    if(entry.getName().endsWith(".class") && !entry.isDirectory()) {
        StringBuilder className=new StringBuilder();
        for(String part : entry.getName().split("/")) {
            if(className.length() != 0)
                className.append(".");
            className.append(part);
            if(part.endsWith(".class"))
                className.setLength(className.length()-".class".length());
        }
        classNames.add(className.toString());
    }

也许正是你想要的。它将监视指定目录并动态加载其中的任何捆绑包。只有捆绑包导出的包才可用于类路径上的其他捆绑包,但所有类都将被加载。

可能正是您想要的。它将监视指定目录并动态加载其中的任何捆绑包。只有捆绑包导出的包才可用于类路径上的其他捆绑包,但所有类都将被加载。

t捕获。。我不知道该加载哪个类。。这个jar中有很多类,我希望所有的类都可以在类路径中使用……谢谢@Mobility。这将真正解决装入所有类的问题。但是现在,如果我想以某种方式访问laoded jar的某个特定类,比如SomeJarClass obj=SomeJarClass.getInstance,这应该可以工作,因为该jar的所有类都已加载。但是,它再次给出了一个类not found异常。我找到了一个解决方案。事实上,我给班级打电话的方式是错误的。现在我能把罐子弄脏了。加载一个主类,该类在内部使用其他JAR中其他类的实例,所有这些实例在运行时都可用。。我不知道该加载哪个类。。这个jar中有很多类,我希望所有的类都可以在类路径中使用……谢谢@Mobility。这将真正解决装入所有类的问题。但是现在,如果我想以某种方式访问laoded jar的某个特定类,比如SomeJarClass obj=SomeJarClass.getInstance,这应该可以工作,因为该jar的所有类都已加载。但是,它再次给出了一个类not found异常。我找到了一个解决方案。事实上,我给班级打电话的方式是错误的。现在我能把罐子弄脏了。加载一个主类,它在内部使用其他JAR中其他类的实例,所有这些实例在运行时都可用。我想要的是加载类路径中所有JAR中的所有类,并在任何时间点访问它们。为什么?如果你不了解自己的动机,你的问题是无法回答的。如果您试图构建一个具有添加插件能力的可扩展应用程序,那么您绝对应该使用OSGi。我想要的是从类路径中的所有JAR加载所有类,并随时访问它们。为什么?如果你不了解自己的动机,你的问题是无法回答的。如果您试图构建一个能够添加插件的可扩展应用程序,那么您绝对应该使用OSGi。