我们的团队将应用程序从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
答案 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。