【问题标题】:In WebLogic 12c, ClassNotFound is thrown even if the jars are there在 WebLogic 12c 中,即使 jar 在那里,也会抛出 ClassNotFound
【发布时间】:2015-10-23 15:18:37
【问题描述】:

我在 WebLogic 12c 的托管服务器上部署了一个 WAR 文件。所有需要的 3rd 方 JAR 都放在 WEB-INF/lib 中。顺便说一句,同样的 WAR 在 WebSphere 和 Tomcat 中工作得很好。当我运行该应用程序时,它报告找不到某个类,该类位于WEB-INF/lib下的jar文件中。

这个类绝对不会被随 WebLogic 安装的类所掩盖。所以我的第一个问题是为什么即使JAR文件在WEB-INF/lib下也没有加载类。

然后我想也许我可以将 JAR 放入 $DOMAIN_DIR/lib 下的系统类路径中,但是会发生同样的错误。我尝试使用类加载器分析工具来定位该类,它显示该类可以在$DOMAIN_DIR/lib 下的jar 文件中找到。然后我很困惑为什么会抛出 ClassNotFoundException。

我不得不承认这是我第一次使用 WebLogic 作为基于客户端请求的应用服务器。所以我不是这方面的专家。如果有人能在这个问题上帮助我,我们将不胜感激。

【问题讨论】:

  • 感谢以下所有答案。但是日志中抱怨的丢失的 Jar 在类路径中是唯一的。最后,似乎有些 Jars 需要与类加载器处于同一级别才能被发现。在我移动了 1 个 Jar 之后,我将环境变量 CLASSPATH 也放入了 WEB-INF/lib,问题就消失了。
  • 你说的是什么环境变量?我们有同样的问题,但我不完全理解你的解决方案。顺便说一句:如果您找到了解决方案,请回答您自己的问题(并接受它)。谢谢

标签: weblogic classloader


【解决方案1】:

在 weblogic.xml 文件中使用 prefer-web-inf-classes 标记以确保 WebLogic 不会覆盖类路径中其他位置的 jar。

更多详情,请查看此页面:

https://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#WBAPP600

【讨论】:

    【解决方案2】:

    识别正在加载哪个 jar 文件的一个好习惯是使用 JVM 属性:-verbose:class

    如果最终它是从您的 jar 文件中加载的,那么可能是树类加载问题。

    【讨论】:

    • 如何在目标托管服务器上执行命令以使用 -verbose 命令?
    • 您可以通过启动脚本或管理控制台添加/修改每个托管服务器的参数:服务器 -> your_managed_server -> 配置 -> server_start。更多详情:docs.oracle.com/cd/E13222_01/wls/docs100/ConsoleHelp/taskhelp/…
    • 我只想将-verbose:class 添加到 Arguments 属性中?
    • 正确。然后您需要重新启动由 NodeManager 处理的托管服务器。
    • 我在日志文件中查找什么?我注意到打印了 400 多行。这个应用程序很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多