首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java ScriptEngine中使用Quercus时,如何注册Quercus自定义函数?

在Java ScriptEngine中使用Quercus时,如何注册Quercus自定义函数?
EN

Stack Overflow用户
提问于 2011-06-27 22:07:28
回答 2查看 740关注 0票数 1

我在Apache JMeter中使用Quercus来编写简单的测试脚本。我有一个要求,从PHP日志使用log4j,这在整体上工作得很好。所以我写了一个Quercus模块,如下所示:

代码语言:javascript
复制
public class LogFunction extends AbstractQuercusModule {

    private static Logger log = Logger.getLogger(LogFunction.class);

    public void log_str(Env env, String str) {
        log.info(str);
    }
}

现在,我使用以下代码对其进行测试:

公共类QuercusTest {

代码语言:javascript
复制
private static ScriptEngine engine;

static{     
    //set up Quercus
    ScriptEngineManager manager = new ScriptEngineManager();
    engine = manager.getEngineByName("php");
}

public static void main(String[] args) throws ScriptException{
    engine.eval("<?php log_str('Hello');");
}

}

这会抛出一个异常(正如我所期望的),因为这个自定义函数没有注册。

代码语言:javascript
复制
Exception in thread "main" com.caucho.quercus.QuercusErrorException: eval::1: Fatal Error: 'log_str' is an unknown function.
    at com.caucho.quercus.env.Env.error(Env.java:6420)
    at com.caucho.quercus.env.Env.error(Env.java:6306)
    at com.caucho.quercus.env.Env.error(Env.java:5990)
    at com.caucho.quercus.expr.CallExpr.evalImpl(CallExpr.java:198)
    at com.caucho.quercus.expr.CallExpr.eval(CallExpr.java:151)
    at com.caucho.quercus.expr.Expr.evalTop(Expr.java:523)
    at com.caucho.quercus.statement.ExprStatement.execute(ExprStatement.java:67)
    at com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:413)
    at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:134)
    at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:179)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
    at com.succeed.QuercusTest.main(QuercusTest.java:18)

但是,我不知道如何在Java脚本引擎中注册这个Quercus模块。文档有点稀疏...任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-19 06:36:38

1.

代码语言:javascript
复制
ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("php");

代码语言:javascript
复制
if( engine instanceof QuercusScriptEngine )
{
    ((QuercusScriptEngine)engine).getQuercus().addModule(new LogFunction());
}

这是可行的。(quercus-4.0.18-src +树脂4.0)

票数 3
EN

Stack Overflow用户

发布于 2011-06-28 04:42:24

我最终抛弃了脚本引擎代码,转而使用原生Quercus:

代码语言:javascript
复制
QuercusEngine engine = new QuercusEngine();
engine.getQuercus().getModuleContext().addModule("LogFunction", new LogFunction());
engine.setOutputStream(os);
engine.getQuercus().init();
engine.execute(phpCode);

这个可以正常工作。它至少有相当可预测的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6494137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档