You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改嵌入式Apache James类加载器,实现同项目自定义钩子加载

在Quarkus中让Apache James加载同Jar内的自定义钩子类

完全可以通过调整类加载器策略或Quarkus构建配置实现,无需将自定义钩子单独打包到/conf/lib目录。以下是具体方案:

方案1:指定James使用应用类加载器

在初始化内存式James服务器时,直接让它复用Quarkus的应用类加载器,这样就能读取同Jar内的自定义类:

JamesServer server = JamesServerBuilder
    .memoryServer()
    .classLoader(Thread.currentThread().getContextClassLoader())
    .build();

这个配置会让James放弃默认优先从/conf/lib加载扩展类的逻辑,转而通过Quarkus的类加载器查找你的CustomAuthHook和CustomMessageHook。

方案2:配置Quarkus确保类可见性

Quarkus的字节码优化可能会裁剪掉它认为“未被使用”的类,需要在application.properties中添加配置避免这个问题:

# 禁止Quarkus裁剪自定义钩子类
quarkus.arc.unremovable-classes=tech.gmork.oxprox.control.hooks.CustomAuthHook,tech.gmork.oxprox.control.hooks.CustomMessageHook
# 让James相关依赖使用应用类加载器加载类
quarkus.class-loading.parent-first-artifacts=org.apache.james:*

保持现有handlerchain配置即可

你当前的handlerchain配置无需修改:

<handlerchain>
    <handler class="org.apache.james.smtpserver.fastfail.ValidRcptHandler"/>
    <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/>
    <handler class="tech.gmork.oxprox.control.hooks.CustomAuthHook"/>
    <handler class="tech.gmork.oxprox.control.hooks.CustomMessageHook"/>
</handlerchain>

只要类加载器配置正确,James就能成功加载同Jar内的钩子类。

额外注意点

  • 确保自定义钩子类正确实现了James对应的Hook接口(如AuthHook、MessageHook),否则James无法识别
  • 开发模式下修改配置后,需重启Quarkus应用才能生效
  • 若遇到类找不到的问题,可添加日志输出类加载路径排查:
System.out.println(CustomAuthHook.class.getClassLoader().getResource(""));

内容的提问来源于stack exchange,提问作者TheFunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:31