我有一个部署在Websphere 8.5上的应用程序,类加载配置为" Parent Last"。在应用程序中,我们使用GroovyScriptEngine
来运行一个groovy脚本文件。
在这个groovy脚本文件中,我们使用:
Thread.currentThread().getContextClassLoader().addURL( new URL("file:/test/ojdbc6.jar"))
加载外部jar文件。但它会导致错误:
groovy.lang.MissingMethodException: No signature of method: com.ibm.ws.classloader.CompoundClassLoader.addURL() is applicable for argument types: (java.net.URL) values: file:/test/ojdbc6.jar
我需要提到的两件事是:
ClassLoader.systemClassLoader.addURL(new URL("file:/test/ojdbc6.jar"))
,那么它在Websphere以及tomcat上运行良好答案 0 :(得分:3)
您必须检查javadoc java.lang.ClassLoader
,并未实施addURL()
方法,它由java.net.URLClassLoader
实施。 CompoundClassLoader
没有扩展它。为了安全起见,您应该始终使用instanceof
进行检查。如果没有,您可以尝试使用方法getParent()
或getSystemClassLoader()
在堆栈中找到更高的类加载器。
问:此错误是否与" Parent Last"在Websphere中设置?为什么?的
不完全是。但是,它与WebSphere中类加载器的模块化有关。在默认设置中,每个模块都由一个单独的类加载器加载,并且模块类加载器没有扩展URLClassLoader
。如果要将服务器类加载器策略切换为服务器的Single,那么它将对所有应用程序使用单个类加载器,但它仍然是层次结构,因此它不能解决您的问题。有关WebSphere Classloaders的详细信息,请查看此链接。
当应用程序类加载器策略设置为Single时,则a 单个应用程序类加载器加载所有EJB模块,依赖项JAR 文件和系统中的共享库。申请时 class-loader策略设置为Multiple,然后每个应用程序接收 它自己的类加载器,用于加载EJB模块, 依赖JAR文件和该应用程序的共享库。
但是对于您的问题,您可以考虑将ojdbc6.jar
添加为shared library吗?那么你不需要嵌入代码来在应用程序中加载它吗?
以下是查看类加载器层次结构的示例代码:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
do {
System.out.println(classLoader.getClass().getName());
System.out.println("Is URLClassLoader: " + (classLoader instanceof URLClassLoader));
classLoader = classLoader.getParent();
} while(classLoader != null);
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("System: " + systemClassLoader.getClass().getName());
System.out.println("Is URL: " + (systemClassLoader instanceof URLClassLoader));
输出:
SystemOut O com.ibm.ws.classloader.CompoundClassLoader
SystemOut O Is URLClassLoader: false
SystemOut O com.ibm.ws.classloader.CompoundClassLoader
SystemOut O Is URLClassLoader: false
SystemOut O com.ibm.ws.classloader.ExtJarClassLoader
SystemOut O Is URLClassLoader: false
SystemOut O com.ibm.ws.classloader.ProtectionClassLoader
SystemOut O Is URLClassLoader: false
SystemOut O com.ibm.ws.bootstrap.ExtClassLoader
SystemOut O Is URLClassLoader: true
SystemOut O org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
SystemOut O Is URLClassLoader: false
SystemOut O sun.misc.Launcher$AppClassLoader
SystemOut O Is URLClassLoader: true
SystemOut O sun.misc.Launcher$ExtClassLoader
SystemOut O Is URLClassLoader: true
SystemOut O System: sun.misc.Launcher$AppClassLoader
SystemOut O Is URLClassLoader: true