ActiveMQ Artemis 2.17.0+自定义登录模块使用Guava缓存报错咨询
异常触发原因
- 依赖版本不兼容:ActiveMQ Artemis 2.16.0自带的Guava版本与自定义登录模块使用的Guava版本匹配,而2.17.0、2.18.0版本调整了内置Guava组件的版本/打包结构。你用到的Guava缓存功能依赖的
com.google.common.util.concurrent.internal.InternalFutureFailureAccess类属于Guava的failureaccess传递依赖,Artemis高版本内置的Guava没有包含该类,且你自定义插件打包时未将该依赖包含在内,触发类找不到异常。 - 类加载隔离机制:Artemis对JAAS登录模块使用独立的类加载器,默认优先加载Artemis自身的公共依赖包,当自定义插件未把所有第三方依赖全量打包时,会自动使用Artemis内置的不兼容Guava版本,进一步加剧了类冲突问题。
解决方案
- 方案1:依赖重定位(推荐)
使用maven-shade-plugin插件将自定义插件用到的Guava、failureaccess等第三方依赖全量打进插件jar包,同时对com.google.common等Guava包路径做重命名,彻底和Artemis内置的Guava版本隔离,不会影响Artemis自身功能。参考配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>com.google.common</pattern> <shadedPattern>com.dallmeier.thirdparty.guava</shadedPattern> </relocation> <relocation> <pattern>com.google.common.util.concurrent.internal</pattern> <shadedPattern>com.dallmeier.thirdparty.guava.internal</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
- 方案2:补充缺失依赖
直接在自定义插件的依赖中显式引入failureaccess包,打包后将该依赖jar和自定义插件jar一起放到Artemis实例的lib目录下,确保类加载器可以找到缺失的类:
<dependency> <groupId>com.google.guava</groupId> <artifactId>failureaccess</artifactId> <version>1.0.1</version> </dependency>
- 方案3:替换缓存实现
移除Guava依赖,改用Caffeine缓存或者JDK原生的ConcurrentHashMap+过期清理逻辑实现缓存功能,从根源上避免Guava版本冲突问题。
内容的提问来源于stack exchange,提问作者Galadriel
相关产品推荐
相关产品推荐

