我们的团队将应用程序从 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 | +----------+-------------+------------------------------+
Structure of application is next. getResource("")
code is placed inside 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
最佳答案
on JBoss this works fine but on Weblogic
getResource("")
returnnull
in this case.
这并不完全令人惊讶,因为 getResource("")
并没有任何意义。空字符串不是资源路径。
我的猜测是 JBoss 只是将参数附加到基本目录的末尾,然后将其解析为文件,而不对该值进行任何健全性检查。 Weblogic 可能正在做一些更严格的事情。
无论出于何种原因,您都需要找到一种更强大的方法来定位基本 EAR 目录,该方法按照设计者预期的方式使用正式的 API。
编辑:据我所知,JavaEE API 没有提供一种方法来完成您想要的操作。您将不得不依赖于应用程序服务器特定的逻辑,要么使用您的 getResource
软糖,要么查询例如嵌入服务器中的 JMX MBean。如果您希望您的应用程序能够在这两种服务器上运行,您需要在运行时自动检测服务器类型,或者更改应用程序以使其根本不需要这些信息。
关于java - getContextClassLoader().getResource ("") 在 Weblogic 上返回 null,而在 JBoss 上返回路径值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841164/