如何让Open Liberty使用Jandex 3版本并优化启动耗时?
问题背景
我尝试用Jandex优化Open Liberty应用的启动时间,按IBM官方文档配置后遇到版本兼容问题:
- 当前用的Open Liberty 21.0.0.6,内置Jandex是2.1.2版本(对应Jar包
com.ibm.ws.org.jboss.jandex_1.0.53.jar) - 就算升级到最新的Open Liberty 22.0.0.13,内置Jandex还是停留在2.x系列
- 不敢直接替换内置的Jandex Jar包,怕搞出兼容性问题,想找个靠谱的办法让Open Liberty用上Jandex 3.x版本
补充测试数据(2023-01-25)
- 场景一:禁用Jandex,应用启动耗时31秒
- 场景二:启用Jandex首次启动,耗时35秒,Jandex日志显示读取了298个模块里的131个索引,覆盖48102个类中的5118个
- 场景三:启用Jandex二次启动,耗时33秒,索引读取流程和首次不一样,应该是缓存起作用了;另外首次启动时Jandex索引读取花了约14秒,效率有点低
可行方案及优化建议
1. 用自定义库加载Jandex 3.x,别直接替换内置Jar
Open Liberty支持通过自定义库加载第三方依赖,不用动内置Jar,步骤很简单:
- 先下载Jandex 3.0.5的核心Jar包(
jandex-3.0.5.jar) - 在Open Liberty服务器的
usr/lib目录下新建个文件夹,比如叫jandex3,把下载好的Jar放进去 - 打开服务器的
server.xml配置文件,添加自定义库的配置:<library id="Jandex3Lib"> <fileset dir="${server.config.dir}/usr/lib/jandex3" includes="*.jar"/> </library> - 给需要用Jandex 3.x的应用或特性关联这个库:如果是单个应用用,就在应用的部署描述符或者
application.xml里指定;要是Open Liberty的特性依赖Jandex,得先确认这个特性支持自定义库优先级——有些核心特性可能必须用内置Jar,那这个方案就用不了
2. 先做兼容性验证再上线
不管用哪种方案,正式部署前一定要验证兼容性:
- 本地搭个测试环境,用上面的自定义库方式加载Jandex 3.x
- 盯着启动日志看,有没有类加载冲突、NoClassDefFoundError这类异常
- 跑一遍应用的核心功能,尤其是依赖注解扫描的部分(比如CDI、JPA),确保正常工作
- 再测一遍启动耗时,确认Jandex 3.x确实能提升性能
3. 针对启动耗时的额外优化办法
从你的测试数据看,首次开Jandex反而变慢,大概率是首次启动要生成、读取大量索引导致的,试试这些优化:
- 提前生成索引:在Maven/Gradle构建应用的时候,用Jandex插件预先生成类的索引文件,打包时把索引放到应用的
META-INF目录里,这样启动时就不用动态生成了。Jandex 3.x的构建插件生成索引效率更高,配置起来也简单 - 缩小扫描范围:在Open Liberty的配置里指定只扫描应用自身和必要的依赖模块,别扫那些没用的。可以用
jandex.indexedModules配置项来指定要索引的模块列表 - 检查缓存配置:确认Open Liberty的Jandex缓存是不是正常生效了,保证二次启动能复用之前生成的索引,减少重复扫描的时间
注意事项
- Open Liberty的一些核心特性(比如CDI、Jakarta EE相关功能)对内置Jandex版本有依赖,直接替换内置Jar很可能导致这些特性失效,所以优先用自定义库的方式
- 如果自定义库满足不了需求(比如核心特性非用内置Jar不可),可以关注Open Liberty的官方更新计划,看看他们什么时候会把内置Jandex升级到3.x系列
内容的提问来源于stack exchange,提问作者stefan.m
相关产品推荐
相关产品推荐

