Java 同一JVM中的类加载器间通信

Java 同一JVM中的类加载器间通信,java,jvm,classloader,Java,Jvm,Classloader,我有一个JVM库(称之为“tool”),它提供服务。对于某些特定功能,工具必须调用第三方代码。它通过将一个用户定义的Jar文件加载到一个自定义类加载器中并调用一个用户定义的函数来实现这一点,该函数接受一个Strings列表作为参数。本质上,它是一个基本的插件基础设施 对于我的用例,我想让两个插件在这些约束条件下相互对话。这些插件可以做任何他们想做的事情(包括产生长寿命的后台线程),但是它们只能被工具调用 对我来说最简单的解决方案是将两个插件“合并”在一起。(假设上述场景是给定的。我已经将事情大大

我有一个JVM库(称之为“
tool
”),它提供服务。对于某些特定功能,
工具
必须调用第三方代码。它通过将一个用户定义的Jar文件加载到一个自定义类加载器中并调用一个用户定义的函数来实现这一点,该函数接受一个
String
s列表作为参数。本质上,它是一个基本的插件基础设施

对于我的用例,我想让两个插件在这些约束条件下相互对话。这些插件可以做任何他们想做的事情(包括产生长寿命的后台线程),但是它们只能被
工具
调用

对我来说最简单的解决方案是将两个插件“合并”在一起。(假设上述场景是给定的。我已经将事情大大简化了。)

我目前的解决方案是将这两个插件都更改为打开TCP套接字,并在初始化时使
工具
传递端口号。然而,这感觉像是一次可怕的黑客攻击,因为它们已经在同一个过程中运行,网络将不必要地使事情复杂化


我的问题是:JVM有没有无痛的类间加载器通信库?它只需要支持传递字符串和本机类型(数组,…),但至关重要的是,它必须只能使用字符串进行初始化。然后,我可以将它打包成
工具
,让其他插件通过它进行通信。假设我可以将任意依赖项添加到插件,但不能添加到
工具

基本思想是使“通信层”成为框架的一部分(即在基本类加载器中)

如果您有相当特定的需求,那么制作一个相对特定的api可能非常容易。一个插件注册为提供者,其他插件可以是消费者

如果您的需求更广泛,那么您可能希望实现(或找到)某种“消息总线”类型的基础设施。为动态传递“消息”提供轻量级机制的东西。每个插件都可以使用特定的名称作为消息目的地,然后其他插件可以向它们发送消息(并可能接收回复)


每个jdk中都内置了另一种可能性,即JMX(一种经常被忽视但功能强大的技术)。您可以使用核心类型提供强类型API,jvm上运行的任何代码都可以与这些API交互(双重好处是您也可以在jvm之外与它们交互)。

我刚刚想到,我的场景类似于让两个web应用程序在应用服务器中相互通信(但没有来自服务器的任何支持)。这不是答案,主要是基于观点的,但osgi是构建此类应用程序的一种方法。更简单的方法是,在用户之间共享一些类classloaders@J即使你选择不使用OSGI(你为什么要这么做?)所有合理的解决方案的原理都是一样的:依赖于共享类加载器加载的类,如果遇到紧急情况,你甚至可以通过
字符串
传递JSON消息。不幸的是,我不能改变
工具
加载插件的方式。特别是,我不能指定公共类。也许我还不理解这个问题,但这是个问题像您所陈述的约束这样的EEM是互不兼容的。您需要更改应用程序以在插件之间进行通信;但是您无法更改应用程序?不幸的是,我无法更改
工具
。您能给我一些关于JMX的通信/消息传递的提示吗?@larsrh-网上有很多JMX教程。我很抱歉d关注MXBeans,例如,作为旁注,jmx允许您使用真正的API,而不是严格的消息传递样式的交互。@larsrh-而且javadoc本身非常广泛:如果您不能更改
工具
,您仍然可以实现一个通信体系结构,作为一个插件,自己加载其他插件你已经考虑过把它们合并成一个插件,有一个模块化的插件更干净…