【发布时间】: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),希望它可以工作,但它没有。
【问题讨论】: