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-проекта.

Другие вопросы по тегам