是否可以要求将 jar 加载到 运行 java 进程中?有这方面的框架吗?

Is it possible to demand load jars into a running java process? Are there frameworks for this?

在尝试设计、实施和测试分布式功能系统时,Remote Promises[1][2][3] 在 Squeak 和 Java 之间有点相同,但存在缺点。我正在寻找解决方法。

  1. 使用 Remote Promises,代理可以更改状态,这会更改 class 实现代理。在 Squeak 中,这是通过#becomeForward: 完成的,而在 Java 中,它需要一个辅助代理,一个可以更改其实现的代理。这确实有效。

  2. 异常应该是非阻塞的,以允许事件循环继续,但也显示问题堆栈以进行调试,脱离隔离。这在 Squeak 中很好,但在 Java 中是一个未解决的问题。我想答案是做所有的日志记录,然后关闭异常,允许事件循环继续:它是服务器风格的日志调试。

  3. 使用元存储库,应该可以请求特定事件类型的负载消费者。将最新发布的代码动态加载到消费者服务器中并分散负载以加快吞吐量。在运行时更新系统以实现连续、无缝的操作。我想这里的解决方案是构建一个动态 jar classLoader 系统。有这方面的例子吗?也许是一个 Apache 项目?


  1. Remote Promises in Squeak
  2. 密码学 吱吱
  3. 远程承诺 Java,叫乌鸦

demand load consumers of a particular event type.

这通常通过 ServiceLoader API. See the AutoService project 来完成,以简化服务的使用。

这可能不是您需要的;您的问题仍然很广泛,并且有很多似是而非的方法。搜索 [dynamically load jars] 会找到可能感兴趣的现有帖子,例如 Load jar dynamically at runtime?

使用针对此类用例的云技术

我想说的是,在当今世界,要获得最新版本的代码,您不需要使用 class 加载程序或编程语言的任何高级功能。您可能会使用某种云服务。

这可能是无服务器云实施或 container/kubernetes (https://kubernetes.io/) 实施。然后,您可以在加载新版本时完美地控制是否要执行 Canary、Blue/Green 或渐进式推出,甚至实施您自己的策略。

因为它可以与容器一起使用,所以无论是 C++、java、python、shell、Squeak 还是其他任何语言都可以。

该层还将提供各种服务的自动缩放、冗余和负载平衡,并在集群上分配工作负载。

您可以使用 gitops 进入下一步。 git 中的 PR 合并自动触发生产中新版本的加载 (https://www.weave.works/technologies/gitops/)

在 Java

中动态加载 jar

仍然肯定 java 由于其 class 加载 API 允许动态加载 classes。这就是 Web 服务器正在做的事情,并且确实存在一些实现,例如 OSGI 或检查 dimo414 的响应。

结论

似乎 java 路由对于像 Eclipse (OSGI) 这样的通用插件系统更有意义,而容器解决方案对于全球分布式系统更有意义,自动缩放 &集群中的弹性。

Kubernetes 可扩展到数千个节点,并提供了一个完整的回声系统来处理分布式系统,它可以扩展和操作任何 linux 或 windows 进程。这是由 Google 推动并被全球数千家公司使用的事实标准。