9

您好,我正在尝试将一些 Beanshell 脚本放入我的 Ant build.xml 文件中。我已经尽可能地遵循了 Ant 手册,但是当我运行 Ant 时,我不断收到“无法为 beanshell 创建 javax 脚本引擎”。这是我主要根据 Ant 手册中的示例编写的测试目标:

<target name="test-target">
    <script language="beanshell" setbeans="true">
        <classpath>
            <fileset dir="c:\TEMP" includes="*.jar" />
        </classpath>
        System.out.println("Hello world");
    </script>
</target>

我的 beanshell“bsh-2.0b4.jar”文件按照手册推荐的方式位于脚本任务的类路径中。希望我有正确的文件。我现在在 c:\TEMP 工作。我一直在谷歌搜索并尝试了一段时间。任何想法将不胜感激。谢谢。

4

4 回答 4

6

首先,您需要来自这里的 jsr-engines.zip:

https://scripting.dev.java.net/servlets/ProjectDocumentList

在里面,您会找到 jsr223/beanshell/build/bsh-engine.jar。一些搜索暗示您需要下载bsh-2.05b.jar。我在这里找到了它:

http://beanshell.org/bsh-2.0b5.jar

更容易找到的 bsh-2.0b4.jar 似乎也可以工作,但它打印了一条消息,暗示它是实验性的。

于 2010-04-27T05:10:12.513 回答
2

目前(2012 年)您只需要 1 个 jar 即可触发 BeanShell 的脚本任务:

之前我也想到了以下,正如 Ant Manual,Library Dependencies 一章中提到的:

但它看起来bsf不需要bsh,至少在我的环境中。

将 jar 交给 ant 后,脚本任务就会顺利运行。获取罐子并将它们提供给 ant 有两种可能的方案。

手动下载方式

下载上面的jar。我提供了来自 Maven 存储库的链接。下载完所有 jar 包后,让它们对 ant 可用。至少有3种方法可以做到:

  1. 把它放在java库路径中
  2. 放到ant库目录下
  3. 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>
于 2012-09-29T14:43:37.563 回答
1

Ant插件“org.apache.ant_1.7.0.v200803061910”有所有需要的jar文件

于 2010-06-22T10:12:14.737 回答
1

不要使用beanshell语言。改为使用javascript,因为它在 jdk6 上运行而无需任何额外的 jar。雷布斯告诉我的。

Javascript也允许使用java类,例如java.lang.System.out.println()

于 2012-09-30T19:30:22.340 回答