尝试在glassfish中动态加载类时发生java.lang.ClassNotFoundException

尝试在glassfish中动态加载类时发生java.lang.ClassNotFoundException,java,jakarta-ee,reflection,glassfish,glassfish-3,Java,Jakarta Ee,Reflection,Glassfish,Glassfish 3,我正在尝试动态加载包含在.jar文件中的类。我知道整个类名,并且我确信该类实现了接口AlgorithmClass。 我的代码如下所示: addURLToSystemClassLoader(dir.toURI().toURL()); Class cl = Class.forName(algorithm.getClassName()); AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance(); private void ad

我正在尝试动态加载包含在.jar文件中的类。我知道整个类名,并且我确信该类实现了接口AlgorithmClass。 我的代码如下所示:

addURLToSystemClassLoader(dir.toURI().toURL());
Class cl = Class.forName(algorithm.getClassName());
AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();
private void addURLToSystemClassLoader(URL url) throws IntrospectionException {
        URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<URLClassLoader> classLoaderClass = URLClassLoader.class; 
        try {
            Method method = classLoaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            method.invoke(systemClassLoader, new Object[]{url});
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IntrospectionException("Error when adding url to system ClassLoader ");
        }
    }
其中dir是.jar文件的文件对象,addURLToSystemClassLoader(URL)如下所示:

addURLToSystemClassLoader(dir.toURI().toURL());
Class cl = Class.forName(algorithm.getClassName());
AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();
private void addURLToSystemClassLoader(URL url) throws IntrospectionException {
        URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<URLClassLoader> classLoaderClass = URLClassLoader.class; 
        try {
            Method method = classLoaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            method.invoke(systemClassLoader, new Object[]{url});
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IntrospectionException("Error when adding url to system ClassLoader ");
        }
    }
但是我得到了一个错误:

java.lang.NoClassDefFoundError:lib/AlgorithmClass/AlgorithmClass

我尝试使用系统类加载器具有的所有URL创建一个新的URLClassLoader,但效果相同

最“糟糕”的是,这两种方法在jUnit测试中都工作得非常好,而jUnit测试是我用来测试这部分代码的


我正在使用Glassfish 3.1.1作为我的应用服务器。

您有类加载问题。您应该知道,您的
addURLToSystemClassLoader()
实际上是一个heck

将您的jar放入类路径。使用
Class.forName()
idiom。若失败,则使用接收类加载器作为参数的版本

   public static Class<?> forName(String name, boolean initialize,
                               ClassLoader loader)
公共静态类forName(字符串名,布尔初始化,
类加载器(加载器)
路径
Thread.currentThread().getContextClassLoader()
作为类加载器参数


另请参见下面我的另一个答案。

您遇到了类加载问题。您应该知道,您的
addURLToSystemClassLoader()
实际上是一个heck

将您的jar放入类路径。使用
Class.forName()
idiom。若失败,则使用接收类加载器作为参数的版本

   public static Class<?> forName(String name, boolean initialize,
                               ClassLoader loader)
公共静态类forName(字符串名,布尔初始化,
类加载器(加载器)
路径
Thread.currentThread().getContextClassLoader()
作为类加载器参数


另请参见下面我的另一个答案。

目录不应包含“lib”。 试试这个:

 ClassLoader cload = new URLClassLoader(new URL[]{dir.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
 Class cl = Class.forName(algorithm.getClassName(), true, cload);
 AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();

目录不应包含“lib”。 试试这个:

 ClassLoader cload = new URLClassLoader(new URL[]{dir.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
 Class cl = Class.forName(algorithm.getClassName(), true, cload);
 AlgorithmClass algorithmClass = (AlgorithmClass)cl.newInstance();

确保jar加载时间早于此代码execution@Luiggi门多萨你什么意思?这段代码的全部要点是在代码的这一部分动态加载类。我的意思是,您应该确保当应用程序服务器部署您的应用程序时,它可以找到JAR(包括包含ide.*的JAR)所有这些都是在编译war代码之前部署的。@LuiggiMendoza并不是真的,因为我在这里使用的.jar是在部署之后上载的。请确保jar的加载时间早于此代码execution@Luiggi门多萨你什么意思?这段代码的全部要点是在代码的这一部分动态加载类。我的意思是,您应该确保当应用程序服务器部署您的应用程序时,它可以找到JAR(包括包含ide.*的JAR)所有这些都是在编译war代码之前部署的。@LuiggiMendoza并不是因为我在这里使用的.jar是在部署之后上传的。