2012-03-15 55 views
3

好了,所以我創建了一個名爲test.js一個JavaScript文件,其中包含下面的代碼:RingoJS中預編譯的JavaScript模塊是如何加載的?

print("It works!"); 

我通過Rhino JavaScript編譯器沒有任何錯誤編譯它。然後,我創建了一個名爲foo.js新文件,其中包含下面的代碼:當我在林戈運行foo.js

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

現在拋出以下異常和堆棧跟蹤:

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(".")); 

但是,它仍然會產生同樣的錯誤。我不知道如何做這項工作。任何幫助將不勝感激。

回答

2

好的,我仔細看了一下堆棧跟蹤,發現它正確找到類文件,它只是試圖從錯誤的包(而不是僅僅是test)加載它。如果類文件位於模塊路徑中,則可以使用模塊(類)名稱正確加載它。默認情況下,當前目錄不是模塊路徑,所以你必須先將其添加:

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

其實'.class'擴展是必要的,因爲它告訴了'ModuleLoader'該文件是需要的是由Rhino'jsc'工具編譯的JavaScript。如果你放棄'.class'擴展名,它會嘗試加載同名的'.js'文件。看到下面的提交:https://github.com/ringo/ringojs/commit/20eee6739da7c69bf93c19d544abc2896df6b7a5 – 2012-03-15 14:14:07

+0

@AaditMShah我看着更接近的錯誤消息,並更新了我的答案。我不知道你是否收到編輯的通知,所以你在這裏。 – 2012-03-15 18:06:22

+0

謝謝。這解決了我的問題。感謝您花時間讓我明白我的錯誤。非常感謝。 =) – 2012-03-15 18:10:13