2013-04-16 39 views
2

我在使用Ant中的<script>標記時遇到問題,我希望有人可以提供幫助。我想在我的Ant build.xml中使用JavaScript。像下面這樣:在Ant中使用JavaScript

<?xml version="1.0" encoding="UTF-8"?> 
<project name="java" default="main" basedir="."> 
    <target name="main"> 
    <script language="javascript"> <![CDATA[ 
println("hello, world") 
    ]]> </script> 
    </target> 
</project>* 

可惜,這只是顯示和錯誤:

build.xml:4: Could not create task or type of type: script.

我已經找到了這種必要的jar文件(js.jar)工作,並把它移到ANT_HOME/lib,但我仍然卡住瞭如何讓這個工作。

+0

是否使用的是螞蟻的版本?在命令行上運行「ant -version」。另外,你正在運行哪個操作系統? –

+0

ANT是紅帽子版本1.6.5 5 u 8操作系統 – ah414

+0

什麼是您的Java版本?查看我對乍得 – Rebse

回答

2

除了js.jar之外,您還需要將bsf.jarcommons-logging-*.jar添加到ANT_HOME/lib。在您的Ant發行版中,有一個名爲docs/manual/install.html的文件。 庫依賴關係此HTML文件的一部分文檔可以在其中下載這些文件。

println在JavaScript中不受支持。相反,使用以下內容:

<project name="jsTest" default="main"> 
    <target name="main"> 
    <script language="javascript"> <![CDATA[ 
     var echo = jsTest.createTask("echo"); 
     echo.setMessage("hello, world"); 
     echo.perform(); 
    ]]> </script> 
    </target> 
</project> 
+1

後追蹤'*',您不再需要js.jar和bsf.jar,因爲jdk> = 6附帶了基於Rhino 1.6R2的內置Javascript腳本引擎 – Rebse

+0

爲什麼不簡單使用打印(「你好,世界」);相反? – Rebse

+0

[Ant 1.6.5不支持JDK 1.6的JavaScript引擎](http://mail-archives.apache.org/mod_mbox/ant-user/201011.mbox/%3COF9BBC5C85.102E2E03-ON652577DE.0032ADE4 [email protected]%3E)。如果用戶2286073升級到Ant 1.7或更高版本,則所有這些問題都將得到解決。 –

1

除了兩個語法錯誤 - 缺少';'在println之後,並且在關閉項目標籤後追蹤'*' - 您應該將您的ant安裝升級到版本> = 1.7.x,並配合jdk> = 6,以便能夠使用內置JavaScript引擎。
當使用JDK> = 6使用的println的是沒有問題的,請參閱:

import javax.script.*; 
public class ExecuteJS { 
public static void main(String[] args) throws Exception { 
ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 
engine.eval("print('Line1')"); 
engine.eval("println('Line2')"); 
engine.eval("print('Line3')"); 
engine.eval("println('Line4')"); 
} 
} 

輸出:

Line1Line2 
Line3Line4 

和使用Ant

<project> 
<script language="javascript"> 
    println("hello, world"); 
</script> 
</project> 

但進一步測試1.9.0/Win7(我的linux系統正在運行)/ jdk1.7.0_21顯示了一些奇怪的現象:

<project> 
<script language="javascript"> 
    println("hello, world"); 
</script> 
</project> 

工作

<project default="foo"> 
<target name="foo"> 
<script language="javascript"> 
    println("hello, world"); 
</script> 
</target> 
</project> 

作品也

<project name="whatever" default="foo"> 
<target name="foo"> 
<script language="javascript"> 
    println("hello, world"); 
</script> 
</target> 
</project> 

作品也,而

<project name="java" default="foo"> 
<target name="foo"> 
<script language="javascript"> 
    println("hello, world"); 
</script> 
</target> 
</project> 

結果

BUILD FAILED 
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot read property "PrintWriter" from undefined (print#8) in print at line number 8 

奇怪!
看起來像一個bug,所以最後升級ant> = 1.7.x和jdk> = 1.6和
不要在項目的名稱屬性中使用'java':-)

0

您還可以實例化並使用Java類當您需要時,可通過Rhino(JRE 1.8或Nashorn(JRE 1.8+))獲得Javascript。

<script language="javascript"> 
    with(new JavaImporter(java.lang, java.io)){ 
    System.out.println("hello, world");// <--!!! 
    } 
</script> 

您可以創建並使用您自己的JavaScript函數。

<script language="javascript"> 
    with(new JavaImporter(java.lang, java.io)){ 
    var fun = function(a,b){ 
     System.out.println(a+b); 
    }; 
    fun(1,2); 
    } 
</script> 

以上代碼打印

3.0 

循環,遞歸和你一直夢想......一切,除了強大的類型檢查:-)