LuaJ:无法致电'要求' Lua脚本中的函数

时间:2013-05-30 21:01:15

标签: lua luaj

我很有可能做出导致此错误的奇怪事情。

以下简单示例失败:

--> thingy.lua
function doThing()
  print( "Thing has been done." );
end

--> test.lua
require( "thingy" );

当执行thingy.lua时,没有问题。执行test.lua时,我看到以下错误:

script:2 module 'thingy' not found: thingy
no field package.preload['thingy']
thingy.lua
no class 'thingy'

这两个文件都存在于同一目录中,我可以使用SciTE(运行Lua 5.1)运行这两个脚本而不会出错。这似乎是一个路径问题,所以我尝试将 package.path 设置为源文件的绝对路径。

注意:我设置路径,而不是追加,以便我可以确定SciTE因为现有的相对路径“?.lua”而没有成功

我在LauJ(使用我自己的程序)和SciTE中测试过,发现SciTE能够执行test.lua,而LuaJ仍然无法执行,并且一如既往地产生相同的错误。

我是否应该在Java代码中执行(或不执行)可能导致此操作的内容?我已成功从Lua脚本访问Java,而不是其他 Lua脚本。只要我手动运行包含它们的脚本,我就可以访问LuaJ中的全局变量和函数。

为了好的衡量,这是我用来执行脚本的Java代码。

// some fancy Java code
public void execute() throws ScriptException, LuaError
{
    try
    {
        FileReader reader = new FileReader( filename );
        Script_Engine.eval( reader );
        reader.close();
    }
    catch( FileNotFoundException fnfe )
    {
        fnfe.printStackTrace();
    }
    catch( IOException ioe )
    {
        ioe.printStackTrace();
    }
}

public void callFunction( String functionName, Object[] args ) throws Exception
{
    File scriptFile = new File( filename );
    FileReader reader = new FileReader( scriptFile );

    CompiledScript script = ((Compilable)Script_Engine).compile( reader );
    script.eval( Script_Bindings );

    LuaFunction lua_function = (LuaFunction)Script_Bindings.get( functionName );
    LuaValue[] vals = new LuaValue[args.length];
    for( int i = 0; i < args.length; i++ )
    {
        vals[i] = CoerceJavaToLua.coerce( args[i] );
    }
    lua_function.invoke( vals );
    reader.close();
}

两个函数中使用的'filename'变量都是在外壳类的构造函数中创建的。

更新 我发现,无论问题是什么,它都存在于LuaJ 3.0版本中(我使用的是JSE包)。用旧的2.03 JAR替换3.0-alpha2 JAR文件后,问题就不复存在了。虽然我很满意我现在可以继续使用旧版本的LuaJ,但我仍然希望使用最新版本。

LuaJ自述文件中有一些内容here说明了以下内容:

  

当调用require()时,它将首先尝试将模块加载为实现LuaFunction的Java类。

并在发行说明部分下:

  

3.0的α2
  通过require()

加载时,供应环境作为LibFunction的第二个参数

我强烈怀疑它与此有关,因为它是在版本3.0-alpha2中添加的,因此我下载了版本3.0-alpha1(使用3.0-alpha2),期望它能够正常工作,但事实并非如此。

2 个答案:

答案 0 :(得分:5)

在与LuaJ的创建者进行一些对话之后,我们确定问题来自于从版本3.0-alpha1开始的更改,其中lua的 package.path 在通过以下方式加载脚本时被忽略的需要即可。这意味着require只会查看路径“。”搜索脚本时如果从子目录调用脚本,将其称为“place”,则 require 可以通过使用点运算符加载它们来找到这些脚本:

require( "place.thingy" );

我怀疑,原因是这个 package.path 问题的问题在社区中有些缺乏,因为有一种方法可以设置从Java端运行的路径在以前的LuaJ v3.0版本中。 (一旦我弄清楚了,我会在正确的方法上发布更新,因为我仍然不清楚这个过程。)

整个情况的长短不一,应该很快就会有一个LuaJ v3.0-alpha3,它允许从lua设置 package.path

再次感谢Jim Roseborough与我合作解决问题。

Jim Roseborough的注释:正如Nathan所说,这确实是luaj-3.0-alpha2中的一个错误。这已得到修复,并且应该在luaj-3.0-beta1及更高版本中按预期工作。现在可以使用。

答案 1 :(得分:-1)

我遇到了同样的问题。我通过将lua脚本移动到我的java项目的资源文件夹来解决它。 luaj-jse 3.0的版本。

或者您可以将lua脚本文件夹路径添加到java项目的类路径中。