Erlang “无法使用”;exmpp_xml";ejabberd中的模块
我正在ubuntu 14.04上使用ejabberd v2.1.11版。编译exmpp模块并复制到Erlang “无法使用”;exmpp_xml";ejabberd中的模块,erlang,ejabberd,exmpp,Erlang,Ejabberd,Exmpp,我正在ubuntu 14.04上使用ejabberd v2.1.11版。编译exmpp模块并复制到/usr/lib/ejabberd/ebin/位置。以下是“my_module”代码 我认为,由于所有的exmpp依赖项都在其自己的模块内,所以将exmpp_*.beam文件复制到ejabberd模块可以访问的/usr/lib/ejabberd/ebin/位置就足以在ejabberd模块中使用,但事实并非如此 尽管上述解决方案可行,但安装exmpp模块以便在ejabberd模块中使用的正确方法是什么
/usr/lib/ejabberd/ebin/
位置。以下是“my_module”代码
我认为,由于所有的exmpp依赖项都在其自己的模块内,所以将exmpp_*.beam文件复制到ejabberd模块可以访问的/usr/lib/ejabberd/ebin/位置就足以在ejabberd模块中使用,但事实并非如此
尽管上述解决方案可行,但安装exmpp模块以便在ejabberd模块中使用的正确方法是什么。有些模块需要先初始化,然后才能使用--它们可能会启动长时间运行的进程或创建ETS表或访问某些远程资源。此外,该模块可能依赖于其他模块,在使用该模块之前需要对其进行初始化,但您不希望对同一模块进行两次初始化!OTP“应用程序”(请参阅)封装了所有这些 通常,在
ebin
目录中会有一个foo.app
文件,该应用文件将描述运行时在运行应用程序之前应该初始化哪些应用程序(其中每个应用程序都有自己的应用程序文件…)
下面是我的一个(这实际上是一个.app.src模板文件,Rebar3将其转换为适当的.app文件,但依赖项部分是相同的):
应用程序中的所有内容都将在我的应用程序之前初始化。然后,将调用mymdw_app
模块中的start/2
方法。ERT将以正确的顺序启动,而不是两次启动。某些模块需要先初始化,然后才能使用它们——它们可能启动长时间运行的进程或创建ETS表或访问某些远程资源。此外,该模块可能依赖于其他模块,在使用该模块之前需要对其进行初始化,但您不希望对同一模块进行两次初始化!OTP“应用程序”(请参阅)封装了所有这些
通常,在ebin
目录中会有一个foo.app
文件,该应用文件将描述运行时在运行应用程序之前应该初始化哪些应用程序(其中每个应用程序都有自己的应用程序文件…)
下面是我的一个(这实际上是一个.app.src模板文件,Rebar3将其转换为适当的.app文件,但依赖项部分是相同的):
应用程序中的所有内容都将在我的应用程序之前初始化。然后,将调用mymdw_app
模块中的start/2
方法。ERT将按照正确的顺序启动,而不是两次启动。了解如何构建和发布erlang/OTP应用程序了解如何构建和发布erlang/OTP应用程序
-module(my_module).
-author("John").
-include("/home/jk/src/exmpp/include/exmpp.hrl").
-include("/home/jk/src/exmpp/include/exmpp_client.hrl").
-include("ejabberd.hrl").
-export([start/2, stop/1]).
-export([on_filter_packet/1]).
-record(state, {}).
stop(_Host) -> ok.
start(Host, Opts) ->
?INFO_MSG("START MODULE LOADING", []),
ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0).
% gen_server:start_link(?MODULE, [Host], []).
on_filter_packet({From, To, Packet} = Input) ->
Parser = exmpp_xml:start_parser(), % FAILS HERE
Schedule = exmpp_xml:parse_final(Parser, "<schedule version='1.0' ></schedule>"),
exmpp_xml:stop_parser(Parser),
Input.
running hook: {filter_packet,[]}
=ERROR REPORT==== 2015-10-13 22:12:24 ===
E(<0.9790.0>:ejabberd_hooks:335) : {badarg,
[{ets,member,
[exmpp_xml_engines_registry,expat],
[]},
{exmpp_xml,is_engine_available,1,
[{file,"./core/exmpp_xml.erl"},
{line,520}]},
{exmpp_xml,get_engine_from_options,1,
[{file,"./core/exmpp_xml.erl"},
{line,4007}]},
{exmpp_xml,start_parser,1,
[{file,"./core/exmpp_xml.erl"},
{line,625}]},
{my_module,on_filter_packet,1,
[{file,"my_module.erl"},{line,52}]},
{ejabberd_hooks,run_fold1,4,
[{file,"ejabberd_hooks.erl"},
{line,331}]},
{ejabberd_router,do_route,3,
[{file,"ejabberd_router.erl"},
{line,315}]},
{ejabberd_router,route,3,
[{file,"ejabberd_router.erl"},
{line,68}]}]}
cp -rf exmpp/c_src/ /usr/lib/ejabberd/
{application, mdw, [
{description, "My Doohickey Whatsit"},
{vsn, "1.0.0"},
{id, "git"},
{modules, []},
{registered, []},
{applications, [
kernel
,stdlib
,mnesia
,ssl
,inets
,lager
,erlcloud
,worker_pool
,wutils
,recon
]},
{mod, {mdw_app, []}},
{env, []}
]}.