目前(2012年),您只需要一个jar文件即可启动BeanShell脚本任务:
之前我也考虑过以下内容,正如Ant手册中提到的Library Dependencies章节:
但看起来在我的环境中,bsf
对于bsh
并不是必需的。
一旦将jar文件提供给ant,脚本任务就可以平稳运行。有两种可能的场景可以获取这些jar文件并使其对ant可用。
手动下载方式
下载上述jar文件。我提供了从maven repository获取链接。一旦您下载了所有的jar文件,请将它们提供给ant。有至少3种方法可以实现:
- 将其放在Java库路径中
- 将其放在ant库目录中
- 为
script
任务提供正确的类路径。
我认为最好的方法是最后一种,因为它最容易在不同系统之间移植。脚本任务的ant文件可能如下所示:
<project default="t1" >
<property name="bsh.path"
location="/mnt/q/jarek/lang/java/ant/stackoverflow/bsh-2.0b5.jar" />
<target name="t1">
<script language="beanshell" classpath="${bsh.path}">
javax.swing.JOptionPane.showMessageDialog(null, "Hello, Script!");
</script>
</target>
</project>
使用Ivy自动下载方法
当您想要分发构建脚本时,手动方法并不完美。这时,您需要一种确保所需jar包在目标系统中存在的方法。对于分发构建,没有比ivy更好的工具了。Ivy会为您下载jar包并将其放入classpath
中。问题是又出现了另一个依赖项,即ivy本身。但提供ivy.jar相当容易,这也是我们需要明确提供的最后一个依赖项。
有人可能会问,既然我们可以以同样的方式下载bsh.jar
,为什么还要提供ivy.jar
呢?答案是灵活性。当您拥有ivy.jar
时,只需添加它到ivy.xml
文件中,就能够获取任何您希望得到的jar包。而且,ivy.jar
文件有一个公认的通用位置,而对于其他文件,我们则需要考虑一个合适的目录。
下面是完整的示例,它会下载ivy以及所有必要的依赖项。Ivy下载脚本基于Ivy参考手册中的安装章节。然后,您只需要一个简单的ivy.xml
文件,该文件在示例的build.xml
之后给出。
原始的自动下载ivy脚本有一个缺点,即即使ivy.jar
已经在预期位置,它仍会检查ivy url。这可以通过指定-Doffline=true
来覆盖。我更喜欢在构建文件中添加另一个目标,并仅在我们没有ivy.jar
时才进行http检查。这就是此处脚本的工作方式。要观察ivy实际下载了什么,请将IVY_HOME
环境变量设置为您选择的目录。它将被创建并填充有ivy内容。
build.xml
:
<project default="t1"
xmlns:ivy="antlib:org.apache.ivy.ant" >
<property name="ivy.install.version" value="2.2.0" />
<property environment="env" />
<condition property="ivy.home" value="${env.IVY_HOME}">
<isset property="env.IVY_HOME" />
</condition>
<property name="ivy.home" value="${user.home}/.ant" />
<property name="ivy.jar.dir" value="${ivy.home}/lib" />
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
<target name="check-ivy">
<condition property="ivy.present">
<available file="${ivy.jar.file}" type="file" />
</condition>
</target>
<target name="download-ivy" unless="ivy.present">
<mkdir dir="${ivy.jar.dir}"/>
<get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
dest="${ivy.jar.file}" usetimestamp="true"/>
</target>
<target name="init-ivy" depends="check-ivy, download-ivy">
<path id="ivy.lib.path">
<fileset dir="${ivy.jar.dir}" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
</target>
<target name="ivy-libs" depends="init-ivy" >
<ivy:cachepath pathid="path.from.ivy" log="download-only" />
</target>
<target name="t1" depends="ivy-libs" >
<script language="beanshell" classpathref="path.from.ivy">
javax.swing.JOptionPane.showMessageDialog(null, "Hello, Script!");
</script>
</target>
</project>
ivy.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation=
"http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="example.com" module="testing-script-task" />
<dependencies>
<dependency org="org.beanshell" name="bsh" rev="2.0b5" />
</dependencies>
</ivy-module>