如何在Ejabberd中运行自定义Erlang模块及配置问题
一、把helloworld模块注册到ejabberd.yml的步骤
要让ejabberd能识别并加载你的自定义模块,需要在/etc/ejabberd/ejabberd.yml里做两处关键配置:
指定模块代码路径
首先你得把编译好的helloworld.beam文件放到ejabberd能找到的目录(比如ejabberd默认的ebin目录,常见路径是/usr/lib/ejabberd/ebin),然后在配置文件里添加代码路径:code_paths: - "/usr/lib/ejabberd/ebin" # 替换成你的beam文件实际所在路径如果你的模块还在
ejabberd/src目录下开发,也可以直接把src目录加入路径:code_paths: - "/path/to/your/ejabberd/src"可选:让模块在ejabberd启动时自动执行
如果你想让ejabberd启动后自动调用helloworld:start(),可以通过钩子配置实现,在yml里添加:hooks: ejabberd_start: - priority: 50 module: helloworld function: start args: []这样ejabberd启动阶段就会自动触发你的start函数。
二、解决undefined function jid:nodeprep/1错误
你碰到的这个错误,核心原因是用普通erl命令启动时,没有加载ejabberd的依赖模块,导致找不到jid:nodeprep/1这个ejabberd内置函数。这里有两个靠谱的解决办法:
使用ejabberd自带的调试控制台
直接在终端运行:ejabberdctl debug这个控制台已经自动加载了所有ejabberd的模块和依赖环境,进入后直接调用
helloworld:start().就不会报错了。编译时手动指定ejabberd依赖路径
如果你一定要用普通erl命令编译模块,得手动指定ejabberd的模块路径(ebin)和头文件路径(include):erl -pa /path/to/ejabberd/ebin -I /path/to/ejabberd/include -c helloworld.erl编译完成后,用带路径的erl命令启动环境:
erl -pa /path/to/ejabberd/ebin -pa ./之后再调用
helloworld:start().就能正常执行了。
另外提个小细节:你的helloworld.erl里的注释用%是符合Erlang语法的,ejabberd_auth:try_register/3的二进制参数写法也没问题,不用调整。
内容的提问来源于stack exchange,提问作者Program-Me-Rev

