从jar动态加载类

Posted

技术标签:

【中文标题】从jar动态加载类【英文标题】:Loading classes dynamically from jar 【发布时间】:2012-09-13 06:49:07 【问题描述】:

我知道我们可以使用自定义类加载器动态加载类。 但这里我的问题是我的类本身依赖于其他类

我的任务是获取 PigServer 对象。所以我使用以下代码加载 PigServer 类

_pigServerClass = _classLoader.loadClass("org.apache.pig.PigServer");

但是这里 PigServer 类本身依赖于许多其他类。

所以当我尝试获取 PigServer 类的实例时,它会显示以下错误

java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
java.lang.ClassNotFoundException:org.apache.log4j.AppenderSkeleton
 etc..

谁能告诉我如何解决这个问题?

【问题讨论】:

【参考方案1】:

似乎有误会。如果你在一个文件夹中有所有需要的 jar,比如“lib”,你可以像这样设置一个类加载器:

    File libs = new File("lib");
    File[] jars = libs.listFiles(new FileFilter() 
        public boolean accept(File pathname) 
            return pathname.getName().toLowerCase().endsWith(".jar");
        
    );

    URL[] urls = new URL[jars.length];
    for (int i=0; i<jars.length; i++) 
        urls[i] = jars[i].toURI().toURL();
    
    ClassLoader uc = new URLClassLoader(urls,this.getClass().getClassLoader());


    Class<?> pigServerClz = Class.forName("org.apache.pig.PigServer", false, uc);
    Object pigServer = pigServerClz.newInstance();
    // etc...

【讨论】:

【参考方案2】:

您是如何创建 ClassLoader 的?

您是否指定了另一个“父”类加载器,可以委托类加载?

【讨论】:

我已经创建了类加载器..它采用类路径并返回 _customClassLoader = new URLClassLoader(urls,PigClassLoader.class.getClassLoader()); 我的类加载器工作正常。就是这样,它没有显示 PigServer 类的类未找到异常 您确定 commons-logging 和 log4j 在类路径中吗? 没有。我希望它作为动态加载。所有这些类都在 Pig.jar 中;我将该 pig.jar 路径作为类路径传递给我的自定义类加载器。 对不起,我想我不明白你的问题是什么。在标准中:一个类将在需要时按需加载。您只需要配置类路径。因此,如果您自己实现它,您将获得更少的类路径配置的好处。那么为什么不将运行时所需的 jar 添加到 Standard-ClassLoader 中呢?见:***.com/questions/1010919/…

以上是关于从jar动态加载类的主要内容,如果未能解决你的问题,请参考以下文章

关于java动态加载jar的问题?

如何在模块化的 java 11 应用程序中动态加载 Libreoffice jar,而不从自定义类加载器中获取 ClassCastException

java可以动态加载一个jar包,并且调用里面的类和方法吗?

动态加载spring xml配置

Java 动态加载jar和class文件

Java_Java中动态加载jar文件和class文件