5

このエラーの原因となっている奇妙なことをしている可能性が非常に高いです。

次の簡単な例は失敗します。

--> 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をソースファイルの絶対パスに設定してみました。

注:既存の相対パス "?.lua" のために SciTE が成功していないことを確認できるように、追加ではなくパスを設定しました。

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 パッケージを使用しています)。3.0-alpha2 JAR ファイルを古い 2.03 JAR に置き換えたので、問題はなくなりました。古いバージョンの LuaJ を使用できるようになったことには満足していますが、それでも最新バージョンを使用したいと考えています。

ここにある LuaJ Readmeには、次のような記述があります。

require() が呼び出されると、最初にモジュールを LuaFunction を実装する Java クラスとしてロードしようとします。

およびリリースノートセクションの下:

3.0-alpha2
require() 経由でロードするときに、LibFunction の 2 番目の引数として環境を指定します

バージョン 3.0-alpha2 で追加されたので、これと関係があるのではないかと強く疑っていたので、バージョン 3.0-alpha1 (3.0-alpha2 を使用していた) をダウンロードして、動作することを期待しましたが、動作しませんでした。

4

2 に答える 2

-1

私も同じ問題を抱えていました。luaスクリプトをJavaプロジェクトのリソースフォルダーに移動することで解決しました。luaj-jse 3.0 のバージョン。

または、lua スクリプト フォルダー パスを Java プロジェクトのクラスパスに追加することもできます。

于 2014-11-09T11:36:01.803 に答える