在Websphere上的Groovy中加载外部jar

时间:2014-11-26 07:34:49

标签: groovy websphere classloader

我有一个部署在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

我需要提到的两件事是:

  1. 同样的应用程序和groovy在tomcat上工作正常
  2. 如果我将groovy更改为ClassLoader.systemClassLoader.addURL(new URL("file:/test/ojdbc6.jar")),那么它在Websphere以及tomcat上运行良好
  3. 我的问题

    1. 这个错误与" Parent Last"有关。在Websphere上设置?为什么?
    2. 为什么系统类加载器工作正常?

1 个答案:

答案 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