尝试在glassfish中动态加载类时发生java.lang.ClassNotFoundException
我正在尝试动态加载包含在.jar文件中的类。我知道整个类名,并且我确信该类实现了接口AlgorithmClass。 我的代码如下所示:尝试在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
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是在部署之后上传的。