Ejabbered 17.09离线消息触发API调用模块编译问题求助
解决Ejabberd 17.09编译mod_offline_post时的"undefined parse transform"错误
我之前帮同行解决过类似的Ejabberd模块编译问题,你遇到的这个错误本质是Erlang编译环境找不到代码里依赖的parse_transform工具——这类工具通常是处理JSON序列化、宏展开或者Ejabberd内部编译规则时用到的。针对Ejabberd 17.09这个特定版本,我给你一套可行的解决流程:
1. 先定位依赖缺失点
首先打开你用的mod_offline_post.erl代码,搜索有没有类似这样的声明:
-compile({parse_transform, jiffy_pt}).
如果有,说明这个模块依赖了jiffy(一款Erlang JSON处理库),但你的环境里没安装这个库,这就是编译报错的根源。
2. 安装对应版本的依赖
Ejabberd 17.09基于Erlang/OTP 19.x,所以要装兼容这个版本的依赖:
- 如果模块用到了
jiffy,请安装0.14.10版本的jiffy(这个版本完美适配OTP 19.x),可以通过Erlang包管理工具或者源码编译的方式安装,确保编译后的ebin目录能被Erlang环境识别。 - 如果你是在非Ejabberd源码环境编译模块,还要确保把Ejabberd的include目录加入编译路径,因为模块会用到Ejabberd的内部头文件。
3. 用正确的命令编译模块
别再用Erlang shell里简单的c(mod_offline_post).命令了,要把依赖的路径都加上,比如:
erlc -I /path/to/ejabberd/include -pa /path/to/ejabberd/ebin -pa /path/to/jiffy/ebin mod_offline_post.erl
把上面的路径替换成你实际的Ejabberd安装目录和jiffy的编译输出目录。
4. 更稳妥的替代方案:自定义轻量模块
如果折腾第三方模块还是有问题,不如直接用Ejabberd 17.09自带的hook机制写个极简模块,完全不用依赖第三方库:
- 新建
mod_offline_webhook.erl,核心代码如下:
-module(mod_offline_webhook). -behaviour(gen_mod). -export([start/2, stop/1, send_notification/3]). -include("ejabberd.hrl"). -include("jlib.hrl"). start(Host, _Opts) -> ejabberd_hooks:add(offline_message_hook, Host, ?MODULE, send_notification, 50), ok. stop(Host) -> ejabberd_hooks:delete(offline_message_hook, Host, ?MODULE, send_notification, 50), ok. send_notification(From, To, Packet) -> % 提取离线消息的内容 Body = xml:get_tag_cdata(xml:get_subtag(Packet, <<"body">>)), % 构造要发送给API的JSON数据(用Ejabberd自带的jsx库) RequestBody = jsx:encode(#{ from => jlib:jid_to_binary(From), to => jlib:jid_to_binary(To), message => Body }), % 调用你的目标API httpc:request(post, {"https://your-target-api.com/webhook", [], "application/json", RequestBody}, [], []), ok.
- 编译这个模块只需要指定Ejabberd的include路径:
erlc -I /path/to/ejabberd/include -pa /path/to/ejabberd/ebin mod_offline_webhook.erl - 最后在
ejabberd.yml里启用这个模块:modules: mod_offline_webhook: {}
5. 验证效果
把编译好的.beam文件放到Ejabberd的ebin目录,重启Ejabberd服务,发送一条离线消息,检查你的API是否收到了请求就行。
内容的提问来源于stack exchange,提问作者sbozzie
相关产品推荐
相关产品推荐

