getContextClassLoader()。getResource(“”)在Weblogic上返回null,而在JBoss上返回路径值

时间:2012-01-12 19:34:30

标签: java spring weblogic classloader

我们的团队将应用程序从JBoss 4.2迁移到Weblogic 10.3.4。

应用程序中有一些逻辑需要知道ear文件名。为此目的,使用以下代码:

URL url = Thread.currentThread().getContextClassLoader().getResource("");

此代码在Spring初始化期间的部署阶段执行。

在JBoss上,这种方法很好,但在这种情况下,Weblogic getResource("")返回null

所以我的问题是为什么这在Weblogic中不起作用?


另外我已经创建了一些小的test.jsp页面,只有几行代码返回值Thread.currentThread().getContextClassLoader().getResource(""),这适用于Weblogic。所以我做了一个小桌子以更清晰的方式显示这种情况:

+----------+-------------+------------------------------+
|          | on JSP page | during spring initialization |
+----------+-------------+------------------------------+
| JBoss    | works       | works                        |
| Weblogic | works       | returns null                 |
+----------+-------------+------------------------------+

接下来是应用程序的结构。 getResource("")代码放在my.jar

my.ear
|
+-my.war
  |
  +-WEB-INF
  | |
  | +-lib
  |   |
  |   +-my.jar
  |   +-org.springframework.aop-3.0.5.RELEASE.jar
  |   +-org.springframework.beans-3.0.5.RELEASE.jar
  |   +-org.springframework.context.support-3.0.5.RELEASE.jar
  |   +-org.springframework.context-3.0.5.RELEASE.jar
  |   +-org.springframework.core-3.0.5.RELEASE.jar
  |   +-other jars
  |
  +-test.jsp
  +-jsp pages    

2 个答案:

答案 0 :(得分:1)

  

在JBoss上运行正常,但在这种情况下,Weblogic getResource("")返回null

这并不奇怪,因为getResource("")没有任何意义。空字符串不是资源路径。

我的猜测是JBoss只是将参数附加到基目录的末尾,然后将其作为文件解析,而不对值进行任何健全性检查。 Weblogic可能会做一些更严格的事情。

无论出于什么原因,您需要找到一种更健壮的方法来定位基本EAR目录,该目录使用正式的API,以设计者的意图。

编辑:据我所知,JavaEE API无法提供您想要的方法。您将不得不依赖于特定于应用服务器的逻辑,使用您的getResource软糖或查询,例如嵌入在服务器中的JMX MBean。如果您希望应用程序同时使用,则需要在运行时自动检测服务器类型 - 或者更改应用程序以使其根本不需要信息。

答案 1 :(得分:0)

在WLS 10.3.5上从耳朵应用程序调用服务时遇到的同样问题。如果您将为路径提供资源名称 Thread.currentThread().getContextClassLoader().getResource("META-INF/wsdls/test.wsdl");这将提供正确的网址路径,如my.jar!META-INF/wsdls/test.wsdl。但是无法加载wsdl。