LuaJ: невозможно вызвать функцию require в скрипте Lua
Есть действительно хороший шанс, что я делаю что-то странное, что вызывает эту ошибку.
Следующий простой пример терпит неудачу:
--> 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, который мог бы вызвать это? Мне удалось получить доступ к Java из сценариев Lua, но не из других сценариев 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). Заменив файл JAR 3.0-alpha2 на более старый JAR 2.03, проблема больше не возникает. Хотя я удовлетворен тем, что теперь могу перейти к более старой версии LuaJ, я все же предпочел бы использовать самую обновленную версию.
В файле Reada LuaJ есть что-то, что говорит следующее:
Когда вызывается require(), он сначала попытается загрузить модуль как класс Java, который реализует LuaFunction.
и в разделе Примечания к выпуску:
3,0-альфа2
Предоставить среду в качестве второго аргумента LibFunction при загрузке через require()
Я сильно подозревал, что это как-то связано с этим, так как он был добавлен в версии 3.0-alpha2, поэтому я скачал версию 3.0-alpha1 (использовала 3.0-alpha2), ожидая, что она будет работать, но это не так.
2 ответа
После некоторых разговоров с создателем LuaJ мы определили, что проблема возникла в результате изменения, которое было сделано начиная с версии 3.0-alpha1, когда lua's package.path игнорировался при загрузке скрипта с помощью require. Это означает, что require будет выглядеть только в пути "." при поиске скриптов. Если есть скрипты, вызываемые из подкаталога, назовите его "place", то require может найти эти скрипты, загрузив их с помощью оператора точки:
require( "place.thingy" );
Я подозреваю, что причина, по которой количество проблем с этой проблемой package.path в сообществе несколько невелико, заключается в том, что существует способ установить путь со стороны Java, который работает в предыдущих выпусках LuaJ v3.0. (Я опубликую обновленную информацию о том, как это сделать, как только разберусь с этим, поскольку мне все еще неясно, как это сделать.)
Суть ситуации в том, что скоро должен появиться LuaJ v3.0-alpha3, который позволяет устанавливать package.path из lua.
Еще раз спасибо Джиму Роузборо за работу со мной, чтобы решить проблему.
Примечание Джима Роузборо: Как упоминал Натан, это действительно было ошибкой в luaj-3.0-alpha2 и ранее. Это было исправлено и должно работать как положено в luaj-3.0-beta1 и более поздних версиях, которые теперь доступны.
У меня такая же проблема. Я решил это, переместив сценарии lua в папку ресурсов моего проекта Java. Версия luaj-jse 3.0.
Или вы можете добавить путь к папке сценариев lua в classpath вашего Java-проекта.