4

<script>在 Ant 中使用标签时遇到问题,希望有人能提供帮助。我想在我的 Ant 中使用 JavaScript build.xml。类似于以下内容:

<?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:无法创建任务或类型类型:脚本。

我已经找到了所需的 jar 文件 ( js.jar) 以使其工作并将其移至ANT_HOME/lib,但我仍然不知道如何让它工作。

4

3 回答 3

3

除了js.jar,您还需要将bsf.jar和添加commons-logging-*.jar到 ANT_HOME/lib。在您的 Ant 发行版中,有一个名为docs/manual/install.html. 此 HTML 文件的Library Dependencies部分记录了您可以下载这些文件的位置。

printlnJavaScript 不支持。相反,请使用以下内容:

<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>
于 2013-04-18T15:57:47.233 回答
3

您还可以在需要时通过 Rhino(JRE pre 1.8) 或 Nashorn(JRE 1.8+) 在 Javascript 中实例化和使用 Java 类。

<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 

循环、递归和你梦寐以求的一切......除了强类型检查:-)

于 2017-07-13T05:35:53.920 回答
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


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

但是用 Ant 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

奇怪的 !?
似乎是一个错误,所以最后升级 ant >= 1.7.x 和 jdk >= 1.6 并且
不要在项目的 name 属性中使用 'java' :-)

于 2013-04-18T21:27:26.990 回答