- 浏览: 159578 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
追求幸福:
每增加一个新的activity, 都要为这个activity指 ...
关于setContentView -
雨过天晴0521:
感谢第一位留言的网友, 我会坚持下去
ADB push的用法 -
小光棍:
謝謝。整理出來的東西真有用!!
ADB push的用法
如何在ant中调用javascript
- 博客分类:
- 数据库
在java6中内置了一个javascript的engine:
Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users. It is embedded in J2SE 6 as the default Java scripting engine.
应用场景1.
在工作中, 我遇到了这样一个应用场景. 调用ant时传的属性参数中有连接数据库的密码, 在log中会显示出来, 如果将密码加密, 那么又会报数据库端的验证错误, 说不认这个经过加密的密码. 怎么办, 有两种方法, 一个是用java写自定义的ant task来解密传给ant script的密码. 然后用明文密码来连接数据库. 写java的缺点在于每次都要事先编译好这个ant task. 还有一种方法是在ant script写一个javascript task. 当然javascript可以调用java的解密函数, 这样不用每次运行ant script前都编译task. 具体脚本如下:
输出
05/25/12 18:46:55.406 INFO: [ProcessWrapper] Executing: D:\build\fabric\DSEngine\resources\win32\wrappid.exe,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\antcall.pid,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tibcojre/1.6.0/bin/java,-cp,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tools/lib/antpackage.jar,org.apache.tools.ant.launch.Launcher,-f,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml,-Dadmin.db.password=#!Panbl6s1FhkBUM70G9T+okR+fv5Nwoq+fYUx+SLzZi8=,-Dadmin.db.url=jdbc:sqlserver://192.168.71.99:1433;databasename=amxdb,-Dadmin.db.username=sa,-Ddb.ddl.path=mssql300,-Ddb.driver.path=D:\build\fabric\DSEngine\work\yangxiaoming-lt-1/fabric/mssql2008_driver,-Dtibco.home=D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx,-Dadmin.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver,cleanup.db.logging,
05/25/12 18:46:55.609 INFO: [ProcessWrapper] [STDOUT] Buildfile: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT] replace.db.password:
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN No appenders could be found for logger (com.tibco.security.TIBCOSecurity).
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN Please initialize the log4j system properly.
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] [echo] Tibc02008
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] cleanup.db.logging:
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] Executing resource: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\mssql300\drop_commonlogging.ddl
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 0 rows affected
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 1 of 1 SQL statements executed successfully
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] BUILD SUCCESSFUL
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] Total time: 1 second
在ant中使用javascript, 在javascript又调用了java, 所以一定要注意数据的boxing和unboxing. 比如用java的方法返回decryptedPassword 时, 它其实已经被unboxing了, 失去了java的char[]类型, 但内在传递的值是不变的, 所以我们需要对它重新boxing, 让它成为java的String类型, 在boxing他的char[]值同时解码, 获得实际字符串, 也就是明文. 再将它传递给javascript的变量.
换句话说, 有的情况js和java的函数相同, 如果var的类型不明显,javascript引擎不知该调用哪个方法, 建议用var input = new String(strInput)
应用场景2.
在工作当中我遇到了这样一种情况, 安装时需要选择administration, runime host这样的安装profile, 这两者是交集. 我们的目的是想以administration里的所有assembly names作为exclude的对象, 在安装runtime host时加以过滤. 从而保留runtime host独有的assemblies.
注意以下问题
1.在这段脚本中:
初看可能会疑惑, targetos为什么标称unix呢? 其实是想和后面的pluginspath="${installation.root}/components/shared/1.0.0/features" featurespath="${installation.root}/components/shared/1.0.0/plugins" 兼容, 如果是没有targetos, 默认的情况下就会根据所在的平台自己判断, 如果在windows上, ${file.separator}就会成为'\', 这样与后面的没办法匹配, 也就过滤失败. 其实ant或者直接说java里都用'/'作为文件分隔符, 即使pluginspath和featurespath里用的是'\'也一样会失败的.
还有人可能会有疑问, pathsep的分隔符为什么要用'${file.separator}**,',而不是',' 原因是我们收集的文件集合里有的是文件夹, 有的是文件, 文件夹必须用'**/文件夹/**过滤', 文件用'**/文件', 而文件用'**/文件/**'也没有问题, 为了把两者都一次性过滤, 所以都用'**/文件或文件夹/**'来过滤.
2. 在<![CDATA[]]>中, 我们可以用javascript和java代码来完成自定义task, 但js和java混用的话,函数又类似的时候可能会混淆编译器. 所以建议要么用javascript, 要么用java的函数, 用java之前最好把js的字符串用new java.lang.String();转化一下, 比如var text = new java.lang.String(attributes.get("text"));
具体可以参考下这篇文章:
https://developer.mozilla.org/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B%E7%9A%84%E8%BD%89%E6%8F%9B/%E5%BE%9E_JavaScript_%E5%88%B0_Java_%E7%9A%84%E8%BD%89%E6%8F%9B
补充:
To do more interesting things with Ant, you have access to properties, targets, and references. For an explanation of properties, targets, and references, refer to the ant manual
project.getProperty(string propertyName);
project.getUserProperty(string propertyName);
project.getTarget(string targetId);
project.getReference(string refereceId);
project is a shortcut for getProject(), which returns the project object.
self returns the script task itself for logging and other task specific utilities.
Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users. It is embedded in J2SE 6 as the default Java scripting engine.
应用场景1.
在工作中, 我遇到了这样一个应用场景. 调用ant时传的属性参数中有连接数据库的密码, 在log中会显示出来, 如果将密码加密, 那么又会报数据库端的验证错误, 说不认这个经过加密的密码. 怎么办, 有两种方法, 一个是用java写自定义的ant task来解密传给ant script的密码. 然后用明文密码来连接数据库. 写java的缺点在于每次都要事先编译好这个ant task. 还有一种方法是在ant script写一个javascript task. 当然javascript可以调用java的解密函数, 这样不用每次运行ant script前都编译task. 具体脚本如下:
<project name="sfamx.cleanupdb" default="cleanup.db.logging"> <dirname property="sfamx.ddl.dir" file="${ant.file.sfamx.ddl.build}"/> <target name="cleanupall" depends="replace.db.password, cleanup.db.logging"/> <path id="jdbc.classpath"> <fileset dir="${db.driver.path}" includes="*.jar"/> </path> <property name="plaintext.password" value="${plainText}"/> <target name="replace.db.password"> <script language="javascript"> <classpath> <!-- for xxx 3.2 --> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.security.tibcrypt_2.15.0.009.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.slf4j.log4j12_1.6.200.001/slf4j-log4j12-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.slf4j.log4j12_1.6.200.001/slf4j-api-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.apache.log4j_1.2.400.002/log4j-1.2.15.jar"/> <!-- for xxx 3.1.5 --> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.security.tibcrypt_2.14.300.006.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.slf4j.log4j12_1.5.101.001/slf4j-log4j12-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.slf4j.log4j12_1.5.101.001/slf4j-api-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.tpcl.org.apache.log4j_1.2.300.004/log4j-1.2.15.jar"/> </classpath> <![CDATA[ importPackage(com.tibco.security); var encryptedPassword = project.getProperty("admin.db.password"); var decryptedPassword = ObfuscationEngine.decrypt(encryptedPassword); var plainText = new java.lang.String(decryptedPassword); project.setProperty("plaintext.password", plainText) ]]> </script> </target> <target name="cleanup.db.logging" depends="replace.db.password" description="Run ddl to cleanup commonlogging tables in external database for amx administrator"> <sql driver="${admin.db.driver}" url="${admin.db.url}" userid="${admin.db.username}" password="${plaintext.password}" print="yes"> <classpath refid="jdbc.classpath"/> <transaction src="./${db.ddl.path}/drop_commonlogging.ddl"/> </sql> </target> </project>
输出
05/25/12 18:46:55.406 INFO: [ProcessWrapper] Executing: D:\build\fabric\DSEngine\resources\win32\wrappid.exe,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\antcall.pid,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tibcojre/1.6.0/bin/java,-cp,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tools/lib/antpackage.jar,org.apache.tools.ant.launch.Launcher,-f,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml,-Dadmin.db.password=#!Panbl6s1FhkBUM70G9T+okR+fv5Nwoq+fYUx+SLzZi8=,-Dadmin.db.url=jdbc:sqlserver://192.168.71.99:1433;databasename=amxdb,-Dadmin.db.username=sa,-Ddb.ddl.path=mssql300,-Ddb.driver.path=D:\build\fabric\DSEngine\work\yangxiaoming-lt-1/fabric/mssql2008_driver,-Dtibco.home=D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx,-Dadmin.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver,cleanup.db.logging,
05/25/12 18:46:55.609 INFO: [ProcessWrapper] [STDOUT] Buildfile: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT] replace.db.password:
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN No appenders could be found for logger (com.tibco.security.TIBCOSecurity).
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN Please initialize the log4j system properly.
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] [echo] Tibc02008
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] cleanup.db.logging:
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] Executing resource: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\mssql300\drop_commonlogging.ddl
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 0 rows affected
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 1 of 1 SQL statements executed successfully
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] BUILD SUCCESSFUL
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] Total time: 1 second
在ant中使用javascript, 在javascript又调用了java, 所以一定要注意数据的boxing和unboxing. 比如用java的方法返回decryptedPassword 时, 它其实已经被unboxing了, 失去了java的char[]类型, 但内在传递的值是不变的, 所以我们需要对它重新boxing, 让它成为java的String类型, 在boxing他的char[]值同时解码, 获得实际字符串, 也就是明文. 再将它传递给javascript的变量.
换句话说, 有的情况js和java的函数相同, 如果var的类型不明显,javascript引擎不知该调用哪个方法, 建议用var input = new String(strInput)
应用场景2.
在工作当中我遇到了这样一种情况, 安装时需要选择administration, runime host这样的安装profile, 这两者是交集. 我们的目的是想以administration里的所有assembly names作为exclude的对象, 在安装runtime host时加以过滤. 从而保留runtime host独有的assemblies.
<target name="gen-zip-excludes"> <path id="my.path"> <dirset dir="${installation.root}/components/shared/1.0.0/features" includes="*"> <depth max="1"/> </dirset> <dirset dir="${installation.root}/components/shared/1.0.0/plugins" includes="*"> <depth max="1"/> </dirset> <fileset dir="${installation.root}/components/shared/1.0.0/plugins" includes="*.jar"/> </path> <pathconvert targetos="unix" property="zip.excludes" refid="my.path" pathsep="${file.separator}**,"> </pathconvert> </target> ... ... <scriptdef name="bwsefilter" language="javascript"> <attribute name="text" /> <attribute name="pluginspath" /> <attribute name="featurespath" /> <attribute name="property" /> <![CDATA[ var text = new java.lang.String(attributes.get("text")); var path1 = new java.lang.String(attributes.get("pluginspath")); var path2 = new java.lang.String(attributes.get("featurespath")); var replaced = text.replaceAll(path1,"**").replaceAll(path2, "**"); project.setProperty(attributes.get("property"), replaced); ]]> </scriptdef> <target name="bwse.distribution.filter"> <bwsefilter text="${zip.excludes}" pluginspath="${installation.root}/components/shared/1.0.0/features" featurespath="${installation.root}/components/shared/1.0.0/plugins" property="file.excludes"/> </target> ... ... <target name="bwse.distribution.package" depends="bwse.distribution.clean"> <zip destfile="${bwse.distribution.name}"> <zipfileset dir="${installation.root}/" includes="bwse/"/> <zipfileset dir="${installation.root}/components" prefix="components" excludes="${file.excludes}"/> <zipfileset dir="${temp.dir}/" includes="grid-library.xml"/> <zipfileset dir="${temp.dir}/" includes="*.properties"/> <zipfileset dir="${download.root}/${bwse.installer.name}" includes="TIB_bwse_${bwse.installer.version}_license.pdf"/> </zip> <delete includeemptydirs="true"> <fileset dir="${temp.dir}/"/> </delete> </target>
注意以下问题
1.在这段脚本中:
<pathconvert targetos="unix" property="zip.excludes" refid="my.path" pathsep="${file.separator}**,">
初看可能会疑惑, targetos为什么标称unix呢? 其实是想和后面的pluginspath="${installation.root}/components/shared/1.0.0/features" featurespath="${installation.root}/components/shared/1.0.0/plugins" 兼容, 如果是没有targetos, 默认的情况下就会根据所在的平台自己判断, 如果在windows上, ${file.separator}就会成为'\', 这样与后面的没办法匹配, 也就过滤失败. 其实ant或者直接说java里都用'/'作为文件分隔符, 即使pluginspath和featurespath里用的是'\'也一样会失败的.
还有人可能会有疑问, pathsep的分隔符为什么要用'${file.separator}**,',而不是',' 原因是我们收集的文件集合里有的是文件夹, 有的是文件, 文件夹必须用'**/文件夹/**过滤', 文件用'**/文件', 而文件用'**/文件/**'也没有问题, 为了把两者都一次性过滤, 所以都用'**/文件或文件夹/**'来过滤.
2. 在<![CDATA[]]>中, 我们可以用javascript和java代码来完成自定义task, 但js和java混用的话,函数又类似的时候可能会混淆编译器. 所以建议要么用javascript, 要么用java的函数, 用java之前最好把js的字符串用new java.lang.String();转化一下, 比如var text = new java.lang.String(attributes.get("text"));
具体可以参考下这篇文章:
https://developer.mozilla.org/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/LiveConnect_%E6%A6%82%E8%A6%81/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B%E7%9A%84%E8%BD%89%E6%8F%9B/%E5%BE%9E_JavaScript_%E5%88%B0_Java_%E7%9A%84%E8%BD%89%E6%8F%9B
补充:
To do more interesting things with Ant, you have access to properties, targets, and references. For an explanation of properties, targets, and references, refer to the ant manual
project.getProperty(string propertyName);
project.getUserProperty(string propertyName);
project.getTarget(string targetId);
project.getReference(string refereceId);
project is a shortcut for getProject(), which returns the project object.
self returns the script task itself for logging and other task specific utilities.
发表评论
-
Linux下安装SF oracle
2013-08-06 16:43 754在使用oracle enabler时需要在engine运行的系 ... -
ORA-01940 如何drop user
2013-03-27 19:28 1513使用drop user bpmuser cascade时遇到以 ... -
如何向apacheDS添加新的user
2013-03-01 12:24 20141.Right-click on the ou=users n ... -
如何导入apache DS的数据
2013-02-28 19:35 15801. 安装好ApacheDS后, 启动ApacheDS ser ... -
ORA-01119: error in creating database file ***
2013-02-20 19:24 6785case1.今天在运行amx-bpm deploy-bpm的脚 ... -
(转)Oracle用户、权限、角色管理介绍
2013-02-20 14:15 776转自:http://blog.csdn.net/jun ... -
about Teradata SQL
2012-11-09 14:37 959http://www.razorsql.com/docs/te ... -
How to change the password for a user in Oracle
2012-11-09 14:34 1018Answer: To change a user's pas ... -
Modify password of an accnout in SQL Server
2012-11-09 14:32 807http://msdn.microsoft.com/en-us ... -
Ant执行SQL server 存储过程时的一个问题
2012-11-07 15:31 1484在ant上执行SQL server的存储过程, 事务不会自动提 ... -
How to forcely drop tables in SQL Server 2008
2012-11-01 17:25 848This script can drop a SQL Serv ... -
Ant中执行oracle存储过程
2012-06-08 15:08 1347同样的oracle dll脚本: declare c int ... -
如何创建SQL Server 2008的数据库
2012-05-09 19:56 1108step 1.打开SQL Server Managem ... -
如何创建oracle新用户(新schema)
2012-05-08 18:24 6823oracle中创建新的user, 也就相应地创建了一个新的sc ... -
详解Oracle用户解锁命令的两则实现方法
2011-08-10 18:58 889在安装完Oracle 10g之后,想打开sql*plus来学习 ... -
Oracle客户端连接数据库总结
2011-08-10 18:56 1146tnsnames.ora文件 这个文件类似于unix 的h ... -
oracle中几个配置文件的作用
2011-08-10 18:55 961tnsname.ora 是客户端用来查找,连接lis ... -
忘记oracle数据库密码怎么办
2011-08-10 18:49 1110很久不用的oralce数据库,如果忘记了密码,可以这样 ...
相关推荐
5. **错误处理**:JavaScript中的异常处理机制也能在Ant脚本中使用,这对于确保构建过程的健壮性至关重要。 在给定的文件列表中,我们看到了一个名为`jeecms-db-2012-sp1.sql`的文件。这很可能是Jeecms内容管理系统...
当用户在输入框中输入验证码时,`onChangeInput`事件处理器会被调用。这里,我们从事件对象中提取验证码值,并在输入有效时更新本地状态。 6. 渲染组件: 最后,组件会渲染一个带有图标的安全证书输入框,以及一...
标题“Java如何与脚本(JavaScript)之间相互调用二”主要探讨的是在Java应用程序中如何集成和调用JavaScript代码,以及反过来JavaScript如何调用Java的功能。这涉及到跨语言交互的技术,通常通过Java的ScriptEngine...
例如,如果一个Ant任务需要在构建过程中动态生成文件,那么可以使用BSF来调用JavaScript引擎,编写一段处理文件操作的脚本,并在Ant任务中执行。这样,开发者就可以利用脚本语言的灵活性来完成一些复杂的构建逻辑,...
《Ant与Apache BSF在Java开发中的应用》 在Java开发过程中,我们常常会遇到构建自动化的需求,这就是Apache Ant(Ant)大显身手的地方。Apache Ant是一个Java库和命令行工具,其任务是驱动构建过程。它通过XML来...
安装Ant后,通过设置环境变量,可以在命令行中直接调用Ant执行构建任务。 总的来说,Apache Ant 1.8.0作为一个高效、灵活的构建工具,是Java开发者不可或缺的工具之一。它简化了项目的构建流程,提升了开发团队的...
然后,在Ant的build.xml文件中,你可以创建一个新的目标(target),使用`java`任务来调用YUI Compressor的命令行接口,对你的JavaScript和CSS文件进行压缩。 以下是一个简单的示例,展示了如何在Ant中配置YUI ...
11. **脚本支持**:Ant允许在任务中内嵌Java、JavaScript或Groovy等脚本,以实现更复杂的逻辑。 12. **外部工具集成**:Ant可以调用外部工具,如Javadoc、ProGuard等,通过`<exec>`任务执行命令行程序。 通过学习...
在"绝对经典"的Ant培训中,你将深入掌握Ant的这些核心概念,并通过实践案例来提升你的Ant使用技能,从而更高效地管理你的Java项目构建过程。通过这份培训资料,你将能够编写出适合自己项目需求的Ant构建文件,提升...
9. **API集成**:如果计算器作为模块提供,可能需要提供API接口,以便在其他项目或工具中调用。 10. **测试**:对计算器进行单元测试和集成测试,确保其在各种场景下表现稳定。 通过Ant Design的调色板计算器,...
10. **脚本支持**:Ant支持内嵌Java、JavaScript或其他脚本语言,使得在构建过程中可以执行动态逻辑。 11. **版本更新**:从1.9.2版本来看,相较于之前的版本,可能引入了新的功能、修复了bug,或者提高了性能和...
标签"npm ant"表明这个压缩包与npm和Ant两个主题相关,可能包含的是一个通过npm发布的Ant包装器,使得在Node.js环境中可以更方便地调用Ant任务。 由于压缩包只包含一个名为"ant"的文件,这可能是一个可执行文件或者...
8. **脚本支持**:Ant 1.6.2版本支持内嵌Java、JavaScript或其他脚本语言,这允许在构建过程中进行更复杂的逻辑处理。 9. **外部工具集成**:Ant不仅限于Java环境,它可以调用任何命令行工具,比如C编译器,使非...
2. 如何配置Ant构建文件以集成SVN:包括引入svn task库,设置svn相关的属性,以及在Ant脚本中调用SVN命令。 3. 使用Ant进行构建和部署的步骤:解释如何运行Ant脚本,以及如何将生成的WAR包部署到Web服务器。 4. 版本...
在Ant中,目标可以有依赖于其他目标的关系,这意味着当某个目标被调用时,其依赖的目标会先执行。这有助于确保构建顺序的正确性。 6. 脚本支持: Ant可以集成JavaScript、Groovy等脚本语言,以实现更复杂的逻辑...
在Ant中,通常使用`scp`任务来实现这个功能,它依赖于JSCH库(JavaScript SSH 2 Library),这是一个用Java编写的SSH2库,支持SFTP(SSH File Transfer Protocol)以及SCP。在提供的文件列表中,我们看到`jsch-0.1....
BSF提供了一个统一的接口,使得开发者可以在Java代码中调用脚本,或者在脚本中调用Java对象,实现脚本语言与Java的无缝集成。 在"ant-apache-bsf-1.7.0.jar"这个库中,Ant和Apache BSF的结合意味着开发者可以在Ant...