【问题标题】:Unable dynamically load java class from shared lib folder无法从共享 lib 文件夹动态加载 java 类
【发布时间】:2012-06-26 00:28:00
【问题描述】:

我有一个 jar 文件,我想将它放入我的应用程序服务器 (WebLogic) 的 共享库 中。该 jar 包含一些实现位于 war 部署 内部的接口的类。并且部署有一个 Spring 单例,它初始化包含在共享 jar 中的类。

所以我猜发生的情况是该类无法加载,因为接口尚未加载(它们在部署中),并且当类加载器尝试加载该类时,它可能会出现一些编译错误(我没有在任何地方都看不到它)并且不加载它,并且当部署尝试实例化尚未加载的东西(共享 jar)时 - 它会出错。

所以问题是我在这里做什么?我如何配置所有这些工作?我真的不想复制包含共享文件夹中所有接口的 jar。 (必须是一个完整的 .war 文件)。

谢谢。

附:不幸的是,在加载域库(共享)文件夹时,我没有任何错误/异常。当我尝试实例化它时,我只有 java.lang.NoClassDefFoundError

【问题讨论】:

  • 我认为你别无选择。将接口移动到 lib 目录。至少尝试一下,看看它是否有效。为什么你对共享库中的实现没有问题,而不是接口?
  • 我试过了,其实我最初就是这么实现的,但是工作的人不习惯把战争档案分开,他们说一切都应该放在一个可交付成果中。我现在正在尝试使用 APP-INF/lib 文件夹的 .ear,如果它有效,我将在此处更新提要。同样关于实施 - 这些是客户实施,并且是可选的;这不是我们作为产品的可交付成果。

标签: java weblogic shared-libraries classloader application-server


【解决方案1】:

我认为您不想使用共享的 lib 目录。听起来您想将客户的 jar 添加到单个战争的类路径中,而不需要他们修改战争或拥有多个可交付成果。我看到了两种方式。两者都需要直接指向本地文件系统,这在 webapps 中通常是一个坏主意。我认为这里可能没问题,因为您指的是可选的客户提供的课程。关键在于这种可扩展性机制可以从 webapp 外部进行更改。但这意味着客户必须在所有系统上手动部署相同的 jar。这在集群中可能很麻烦,而且显然需要直接访问应用服务器的文件系统。

  1. 我不记得这是否可行,但您应该能够将一个 jar 放入 webapp 的 WEB-INF/lib 中,该 jar 具有 META-INF/MANIFEST.MF,其类路径指向战争之外。这必须是一个已知的硬编码位置。它可以是相对于当前工作目录的相对路径。这通常是应用服务器的主目录或您的域的主目录。

  2. 构造您自己的 ClassLoader 实例。它可能应该是 URLClassLoader,因此您可以让您的客户提供目录或单个 jar 文件。将此类加载器的父级设置为 webapp 的类加载器。它可以指向在运行时确定的位置。这里的问题是在所有正确的地方使用这个类加载器。我不知道任何通用的方法,所以我会推荐第一个选项。

【讨论】:

  • 哇,成功了!多谢!它适用于相对 URL,但不适用于绝对 URL,不过我仍在尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2016-12-05
  • 2017-09-15
  • 1970-01-01
  • 2013-02-21
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多