如何控制 Liberty 配置文件中的模块加载顺序

How to control module loading order in Liberty profile

我有一个 ear 文件,其中包含一个 web 模块和一个 ejb 模块(仅用于消息驱动的 bean)。 ejb 模块依赖于 web 模块,它是 类。我需要先加载 web 模块,然后再加载 ejb 模块。但是自由总是首先加载 ejb 模块导致 com.ibm.ws.container.service.state.StateChangeException: java.lang.NoClassDefFoundError:

如何控制同一个ear文件中模块加载的顺序?在传统的 webshpere 上有一个名为 'Starting weight' 的选项。具有最低值的模块优先并首先加载它。因此该应用程序在传统 Websphere 上运行良好。但是,这个 属性 似乎在 Liberty 上不见了。我已经看过 。它只讨论部署多个 war 文件及其顺序。

考虑使用此处所述的控制应用启动顺序的功能:https://www.openliberty.io/blog/2020/06/05/graphql-open-liberty-20006.html?_ga=2.4728563.17466047.1620833568-1423690488.1614284842&cm_mc_uid=99965752544816136653536&cm_mc_sid_50200000=61078141620909829332#ORDER 您必须将 war 模块部署为应用程序而不是将其打包在耳内,但您应该能够实现正确的排序。

如果您的 EJB 模块依赖于 Web,那是糟糕的设计。应该是反过来的。

如果你遇到这种情况,正确的方法是将共享的 classes 提取到一个普通的 jar 文件中,比如 mycommon.jar,然后将其放入 ear\lib 文件夹中。通过这种方式,它们将对模块 ejb 和 web 可见。
如果您的 EJB 模块依赖于 javax web api(例如 servletRequest),那就更糟了,您应该将此类 classes 重新设计为 POJO DTO。

作为最后的手段,您可以尝试 中描述的方法并在您的 application.xml.

中添加 <initialize-in-order>true</initialize-in-order>

FRowe 的解决方案将不起作用,因为 classes 不在应用程序之间共享,因此更改应用程序的加载顺序无济于事。每个 Java™ EE 应用程序在 运行 Liberty 服务器中都有自己的 class 加载器。