我有一个jar文件,我想将其放入应用程序服务器(WebLogic)的共享库中。该jar包含一些类,这些类实现位于war部署内部的接口。部署中有一个Spring单例,用于初始化共享jar中包含的类。
所以我想发生的是该类无法加载,因为尚未加载接口(它们已经在部署中),并且当类加载器尝试加载该类时,它可能会遇到一些编译错误(我看不到)并不会加载它,并且当部署尝试实例化尚未加载的东西(共享jar)时,它会出错。
所以问题是我在这里做什么?如何配置所有这些以便工作?我真的不想复制包含共享文件夹中所有接口的jar。 (必须是一个完整的.war文件)。
谢谢。
附言不幸的是,在对域lib(共享)文件夹进行类加载时,我没有任何错误/异常。当我尝试实例化它时,我只有java.lang.NoClassDefFoundError。
最佳答案
我认为您不想使用共享的lib目录。听起来您想将客户的罐子添加到单个战争的类路径中,而无需他们修改战争或具有多个可交付成果。我看到两种方式。两者都需要直接指向本地文件系统,这在webapps中通常是个坏主意。我认为这里可能还可以,因为您指向的是可选的客户提供的类。整个问题在于,这种可扩展性机制可以从Web应用程序外部进行更改。但这意味着客户必须手动在所有系统上相同地部署jar。这在集群中可能会很麻烦,并且显然需要直接对应用服务器进行文件系统访问。
我不记得这是否行得通,但是您应该能够将jar放入具有META-INF / MANIFEST.MF的web应用程序的WEB-INF / lib中,其类路径指向战争之外。这必须是一个已知的硬编码位置。它可以是相对于当前工作目录的相对路径。通常是应用程序服务器的主目录或您域的主目录。
构造自己的ClassLoader实例。它可能应该是URLClassLoader,以便您可以让客户提供目录或单个jar文件。将此类加载器的父级设置为Webapp的类加载器。它可以指向运行时确定的位置。这里的问题是在所有正确的位置使用此类加载器。我不知道要使用哪种通用方法,因此建议您使用第一种方法。