在我的ANT脚本中,我有时会写tasks runnning javascript with Rhino。
但是,我对如何将参数传递到这些任务感到茫然。有什么想法吗?
例如......这是一个这样的任务的例子:
<script language="javascript"> <![CDATA[
//some nonsense to fake out rhino into thinking we've a dom, etc.
this.document = { "fake":true };
this.window = new Object( );
this.head = new Object( );
eval(''+new String(org.apache.tools.ant.util.FileUtils.readFully(new java.io.FileReader('coolJavascript.js'))));
//... do some stuff
var s = java.io.File.separator;
var fstream = new java.io.FileWriter( ".." + s + "build" + s + "web" + s + "js" + s + "coolChangedJavascript.js" );
var out = new java.io.BufferedWriter( fstream );
out.write( jsCode );
out.close( );
]]> </script>
答案 0 :(得分:8)
要使用脚本定义ant任务,您可以使用scriptdef
任务而不是script
。使用scriptdef
,可以使用预定义的对象来访问任务中的属性和嵌套元素。
这适用于从Ant中访问javascript中的属性:
<scriptdef name="myFileCheck" language="javascript">
<attribute name="myAttribute" />
<![CDATA[
importClass(java.io.File);
importClass(java.io.FileReader);
importClass(java.io.BufferedReader);
var fileName = attributes.get("myAttribute"); //get attribute for scriptdef
var reader = new BufferedReader(new FileReader(new File(fileName)));
//... etc
project.setProperty("my.result", result));
]]>
</scriptdef>
然后可以去:<myFileCheck myAttribute="./some.file" />
与常规蚂蚁任务相同
如果需要,还可以使用文件集等,更多详细信息请访问:http://ant.apache.org/manual/Tasks/scriptdef.html
好处是你可以在你的ant脚本中内联定义你的任务,而不是用Java编写它们然后必须构建和包含类文件。
您需要使用Java1.6(或更高版本),或在类路径中使用apache BSF。
答案 1 :(得分:2)
我想到了两个建议。首先,您可以从javascript中访问Ant属性。您参考的文档中有一些示例:
var x = project.getProperty( "my.property" );
可以在脚本中使用来获取XML中属性集的值,可能是这样的:
<property name="my.property" value="x" />
其次,您可以考虑使用scriptdef
,这将允许您定义可以从javascript轻松访问的属性和子元素。