【问题标题】:How are precompiled JavaScript modules loaded in RingoJS?RingoJS 中如何加载预编译的 JavaScript 模块?
【发布时间】:2012-03-15 03:41:57
【问题描述】:

好的,所以我创建了一个名为 test.js 的 JavaScript 文件,其中包含以下代码:

print("It works!");

我使用 Rhino JavaScript 编译器编译它,没有任何错误。然后我创建了一个名为foo.js 的新文件,其中包含以下代码:

var test = require("./test.class");

现在,当我在 Ringo 中运行 foo.js 时,会引发以下异常和堆栈跟踪:

Uncaught exception:
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.ringojs.tools.launcher.Main.run(Main.java:66)
    at org.ringojs.tools.launcher.Main.main(Main.java:45)
Caused by: java.lang.NoClassDefFoundError: /home/aaditmshah/test (wrong name: test)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at org.mozilla.javascript.DefiningClassLoader.defineClass(DefiningClassLoader.java:62)
    at org.ringojs.engine.ClassModuleLoader.load(ModuleLoader.java:126)
    at org.ringojs.engine.ReloadableScript.compileScript(ReloadableScript.java:153)
    at org.ringojs.engine.ReloadableScript.getScript(ReloadableScript.java:118)
    at org.ringojs.engine.ReloadableScript.exec(ReloadableScript.java:227)
    at org.ringojs.engine.ReloadableScript.load(ReloadableScript.java:215)
    at org.ringojs.engine.RingoWorker.loadModuleInternal(RingoWorker.java:283)
    at org.ringojs.engine.Require.call(Require.java:81)
    at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
    at org.mozilla.javascript.gen._home_aaditmshah_foo_js_3._c_script_0(/home/aaditmshah/foo.js:1)
    at org.mozilla.javascript.gen._home_aaditmshah_foo_js_3.call(/home/aaditmshah/foo.js)
    at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:426)
    at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3178)
    at org.mozilla.javascript.gen._home_aaditmshah_foo_js_3.call(/home/aaditmshah/foo.js)
    at org.mozilla.javascript.gen._home_aaditmshah_foo_js_3.exec(/home/aaditmshah/foo.js)
    at org.ringojs.engine.ReloadableScript.evaluate(ReloadableScript.java:186)
    at org.ringojs.engine.RingoWorker.evaluateScript(RingoWorker.java:315)
    at org.ringojs.engine.RhinoEngine.runScript(RhinoEngine.java:186)
    at org.ringojs.tools.RingoRunner.run(RingoRunner.java:152)
    ... 6 more
enter code here

我不知道我哪里错了。我有最新版本的 Ringo 和 Rhino 1.7R3。我通过将以下行添加到foo.js,将当前目录添加到我的类路径:

addToClasspath(module.resolve("."));

但是,它仍然会产生相同的错误。我不知道如何使这项工作。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript module rhino precompiled ringojs


    【解决方案1】:

    好的,我仔细查看了堆栈跟踪,并意识到它正确地找到了类文件,它只是尝试从错误的包中加载它(home.aaditmshah.test 而不仅仅是test)。如果类文件在您的模块路径中,您可以仅使用模块(类)名称正确加载它。默认情况下,当前目录不在模块路径中,因此您必须先添加它:

    require.paths.push('.')
    var test = require("test.class");
    

    【讨论】:

    • 实际上.class 扩展是必要的,因为它告诉ModuleLoader 所需的文件是由Rhino jsc 工具编译的JavaScript。如果您删除 .class 扩展名,它将尝试加载同名的 .js 文件。请参阅以下提交:github.com/ringo/ringojs/commit/…
    • @AaditMShah 我仔细查看了错误消息并更新了我的答案。我不知道你是否会收到编辑通知,所以你去吧。
    • 谢谢。这解决了我的问题。感谢您花时间让我理解我的错误。非常感谢。 =)
    • 感谢您提出这个问题!是的,为了加载一个 Java 类,Ringo 必须知道它的完整类名(包括包名)。我们可能可以从类文件中提取它,但目前该名称是从 ringo 模块名称派生的。对于从模块搜索路径外部加载的模块,即完整文件路径。也许这是我们可以改进的地方。
    • @HannesWallnöfer 如果你想保持包名基于模块路径的限制,也许你可以确保包名与路径名的末尾匹配。所以/path/to/org/package/classname 将适用于org.package.classname 类(或只是classname 等),但不适用于org.somethingElse.classname。只是一个想法。
    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多