目前(2012 年)您只需要 1 个 jar 即可触发 BeanShell 的脚本任务:
之前我也想到了以下,正如 Ant Manual,Library Dependencies 一章中提到的:
但它看起来bsf
不需要bsh
,至少在我的环境中。
将 jar 交给 ant 后,脚本任务就会顺利运行。获取罐子并将它们提供给 ant 有两种可能的方案。
手动下载方式
下载上面的jar。我提供了来自 Maven 存储库的链接。下载完所有 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
当您想要分发构建脚本时,手动方法并不完美。然后你想要一种方法来确保目标系统中存在罐子。对于分发构建,没有比ivy更好的工具了。常春藤将下载罐子并classpath
为您放入。问题是出现了另一种依赖关系,即 ivy 本身。但是提供 ivy.jar 非常容易,这是我们需要明确提供的最后一个依赖项。
有人可能会问为什么要提供ivy.jar
,而我们可以bsh.jar
用同样的方式简单地下载。答案是灵活性。当您拥有 . 时,您只需将其添加到文件中ivy.jar
即可获得您想要的任何 jar 。ivy.xml
并且文件有一个约定的通用位置ivy.jar
,而对于其他文件,我们必须考虑一个合适的目录。
下面是下载常春藤的完整示例,然后是所有必要的依赖项。Ivy 下载脚本基于Ivy 参考的安装章节。然后需要一个简单的ivy.xml
文件,在 sample 之后给出build.xml
。
原始自动下载 ivy 脚本的缺点是总是检查 ivy url,即使ivy.jar
它已经在预期的位置。这可以通过指定来覆盖-Doffline=true
。我更喜欢在构建文件中添加另一个目标,并且只有在我们还没有ivy.jar
. 这就是这里脚本的工作方式。要观察 ivy 实际下载的内容,请将IVY_HOME
环境变量设置为您选择的目录。它将被创建并充满常春藤的东西。
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}"/>
<!-- download Ivy from web site so that it can be used even without any special installation -->
<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">
<!-- try to load ivy here from ivy home, in case the user has not already dropped
it into ant's lib dir (note that the latter copy will always take precedence).
We will not fail as long as local lib dir exists (it may be empty) and
ivy is in at least one of ant's lib dir or the local lib dir. -->
<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" />
<!-- <dependency org="bsf" name="bsf" rev="2.4.0" /> -->
</dependencies>
</ivy-module>