【问题标题】:WebSphere Portal Server ClassLoader doesn´t work after redeployWebSphere Portal Server 类加载器在重新部署后不工作
【发布时间】:2014-02-15 16:54:57
【问题描述】:

我有一个简单的 portlet 可以部署在 WebSohere Portal Server 中。

这是一个战争文件,在其 lib 文件夹中包含一个 jar 文件。在 jar 文件中,我尝试读取属性文件。在我的 portlet 项目中,我在 src 的根目录中有一个属性文件,并且可以毫无问题地读取 jar 文件中的该属性文件。

但是,如果我重新部署 war 文件并且不重新启动服务器,下面的代码行将返回 null 并且它无法从属性文件中读取。重启服务器后一切正常。

InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("myFile.properties");

我检查了 ClassLoader 的设置,并且父级是 LAST。我不知道是什么原因。有什么想法吗?

【问题讨论】:

    标签: java classloader portlet websphere-portal


    【解决方案1】:

    尝试使用上下文类加载器而不是类的类加载器,因为您没有将 jar 中的资源与类捆绑在一起(如果我正确阅读了您的描述)。

    Thread.currentThread().getContextClassLoader().getResourceAsStream(...)

    您是否偶然在另一个 Web 模块或 WebSphere 共享库文件夹中拥有此 jar?由于您描述的行为是 null 而不仅仅是旧文件值,我不太倾向于认为涉及缓存,而且您只是获得了一个与您认为的不同的类实例,并且因为您使用的类加载器实用程序类本身,未找到 web 模块的 WEB-INF/classes 中的属性文件。

    【讨论】:

    • 成功了!谢谢。重新部署前后的war文件也是一样的,jar文件在WEB-INF/lib中。我认为它与 webSphere 配置有关,与战争文件无关......
    【解决方案2】:

    出于性能原因,该文件被读取一次并被缓存。

    编辑:如果您希望修改文件,请将文件保留在本地文件系统上的 EAR 文件之外,并使用环境/服务器变量指向其路径。参考代码中的变量来加载文件。

    【讨论】:

    • 所以,你的意思是重新部署后不可能有一个 inputStream 吗?那我怎么才能再次访问呢?
    • 您可以尝试清除 temp 和 wstemp 目录。但这也涉及重新启动应用服务器。第 22 条军规。 :)
    • 谢谢,但我不想重新启动服务器...没有其他解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多