无法从共享库文件夹动态加载java类

时间:2012-06-26 00:28:00

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

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

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

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

感谢。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题