【问题标题】:LuaJ: Unable to call 'require' function in Lua scriptLuaJ:无法在 Lua 脚本中调用“require”函数
【发布时间】:2018-07-15 18:27:14
【问题描述】:

很有可能我正在做一些奇怪的事情导致这个错误。

以下简单示例失败:

--> 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,而不是 other 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();
}

两个函数中使用的“文件名”变量是在房屋类的构造函数中创建的。

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

here 找到的 LuaJ 自述文件中有如下内容:

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

在发行说明部分:

3.0-alpha2
通过 require() 加载时提供环境作为 LibFunction 的第二个参数

我强烈怀疑它与此有关,因为它是在 3.0-alpha2 版本中添加的,所以我下载了 3.0-alpha1 版本(正在使用 3.0-alpha2),希望它可以工作,但它没有。

【问题讨论】:

    标签: lua luaj


    【解决方案1】:

    在与 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 及更高版本中应该可以正常工作,现在可用。

    【讨论】:

    • 感谢您的回答。我非常困惑为什么这不起作用 - package.path 确实被忽略了(通过将其设置为 "" 并使用名为 foo.lua 的文件运行 require('foo') 来确认cwd。
    【解决方案2】:

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

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

    【讨论】:

    • 我描述的问题已在 3.0 版本中得到修复。这只是一个短时间的问题。我相信我也可以通过将脚本放在主路径中来获得结果,但代价是会损害我的项目所需的结构。
    猜你喜欢
    • 2012-06-30
    • 2015-02-19
    • 2016-04-29
    • 2014-01-31
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多