2014-07-04 33 views
13

我需要使用JavaScript中的jar文件中的類。我使用JavaScript通過Java的ScriptEngine,很想做同樣的事情,以我使用Jython在這裏做了,通過Java在JavaScript中使用jar ScriptEngine

import org.python.core.Py; 
    import org.python.core.PySystemState; 
    ... 
    PySystemState engineSys = new PySystemState(); 
    engineSys.path.append(Py.newString("C:/GMSEC_API/bin/gmsecapi.jar")); 
    Py.setSystemState(engineSys); 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python"); 

當我做到這一點使用Jython它正常工作和Python文件可以使用的API類在jar文件裏面。

+0

Jar是一個java歸檔文件。它與JavaScript無關。 – MightyPork

+13

JavaScript可以使用Java的類。我想要使​​用的Java類位於Jar文件中。您是否沒有看到上面的代碼與Python/Jython相同的想法? –

回答

6

我可以用這種方法在JavaScript中使用jar的類,但是當你運行它時,你必須將jar設置爲類路徑。我之前的解決方案類似於Jython/Python,您可以在Java中設置jar,但我只是要創建批處理文件和sh文件並設置它(現在似乎更容易)。這是我的解決方案,適合我。編譯你可以使用-d .如果你有你的java文件,你定義的包時

  • 爲了然後編譯運行:

    cd C:\your\directory\folder\with\the\javascript\and\java\files 
    
        javac -d . ClassSpy.java FileSearch.java HelloWorld.java Main.java Parameters.java Run.java 
    
        java -cp ./;C:\ABCAPI\bin\abcapi.jar hammer.main.Main gui=true input=JavaScriptStatus.js 
    

    評論上述線路它會將它們放在包名稱的文件夾中。如果這還不清楚,請查看這篇文章(我正在下車)How to compile packages in java?

  • 另一個需要注意的是,當我運行它時,我在課程路徑中添加了兩件事-cp表示類路徑,之後的任何內容都將添加到您的類路徑中以進行當前運行。你可以用分號分隔它們。 ./將當前目錄添加到類路徑中,之後我添加的其餘部分是我需要的API的jar文件的位置。

  • hammer.main是類Main包的位置,它是包含我的啓動程序主函數的類。

  • 之後的兩個參數特定於我的程序,您可以看到我要告訴Java ScriptEngine讀取和執行的JavaScript文件。

要使用的jar文件中的JavaScript:

現在的jar文件是在類路徑上可見,我們可以從jar文件裏面得到一個包,然後從包中調用的類。因此,對於以下示例,abc.foo.pack.nameabcapi.jar中的一個包,我使用的兩個類ClassFromTheJarFileAnotherClassFromTheJarFile位於該包中。我正在使用一種將包設置爲變量的技術,然後將我想要使用的類前綴添加到包含該包的變量中。另一種方式是說importPackage(com.foo.bar)那麼你不必在每次實例化它們時都要爲類加前綴,但是這種技術由於某種原因不適用於我(也許我做了一些錯誤的事情)。無論如何,下面的代碼工作正常,我,

myvariable = Packages.abc.foo.pack.name; 

    var foo = new myvariable.ClassFromTheJarFile("arg1","arg2"); 

    foo.doSomething(); 

    var fooSister = new myvariable.AnotherCLassFromTheJarFile("arg1"); 

    fooSister.doSomthingFromThisClass(); 

結論:

事實證明我的錯誤是試圖直接導入類這樣的,

myvariable = Packages.abc.foo.pack.name.ClassFromTheJarFile; 

然後我嘗試使用它,

var foo = new myvariable.ClassFromTheJarFile("arg1","arg2"); 

這是不工作。

我希望這可以幫助別人,因爲我收到了很多評論,比如「你知道Java和JavaScript是兩回事」。那麼是的,我知道這一點,你有什麼意見?

記住:

我不是在瀏覽器中或在互聯網上使用此。我通過Java ScriptEngine使用它。如果您需要從URL中獲取該jar文件,我發現這個鏈接可能會對您有所幫助http://mozilla-firefox-extension-dev.blogspot.com/2004/11/calling-java-code-in-custom-jars-from.html