0

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

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

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

谢谢。

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

4

1 回答 1

1

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

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

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

于 2012-06-26T10:25:07.950 回答