0

我有一个jar文件,我想将其放入我的应用程序服务器(WebLogic)的共享库中。该jar包含一些正在实现接口的类,这些接口位于战争部署的内部。部署有一个Spring单例,用于初始化共享jar中包含的类。无法从共享lib文件夹动态加载java类

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

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

谢谢。

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

+0

我不认为你有选择。将接口移动到lib目录。至少尝试一下,看看它是否有效。你为什么在共享库中的实现而不是接口? –

+0

我已经尝试过了,事实上这就是我最初实现它的原因,但工作中的人不会分开战争档案,他们说所有东西都应该在一个可交付物中。我正在尝试.ear现在,使用APP-INF/lib文件夹,如果它起作用,我会在这里更新提要。同样关于实现 - 这些是客户实现,并且是可选的;这不是我们作为产品的可交付成果。 – nisenish

回答

1

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

  1. 我不记得,如果这个工程,但你应该能够把一个罐子在webapp的WEB-INF/lib中有META-INF/MANIFEST.MF其类路径外战点。这将是一个已知的硬编码位置。它可以是相对于当前工作目录的相对路径。这通常是应用程序服务器的主目录或您的域的主目录。

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

+0

哇,它的工作!非常感谢!它使用相对URL,但不是绝对的,我仍然尝试。 – nisenish