Ant中使用Beanshell出现问题,提示"无法为beanshell创建javax脚本引擎"。

10

你好,我正在尝试在我的Ant build.xml文件中添加一些Beanshell脚本。我已经尽可能地遵循了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个回答

6

啊,成功了!非常感谢。我将这两个文件都包含在我的任务类路径中,就解决了问题。我很好奇你是如何发现 b5 版本的。也许这是一个开发版本。 - Vimes
在谷歌上进行了大量搜索,我得出的印象是BeanShell已经被放弃了。 - Brett Kail
第一个链接已经失效,但我在这里找到了它:http://www.java2s.com/Code/JarDownload/bsh-engine-20061013.jar.zip - Travis
1
BSF之所以被“废弃”是因为它已成为JSR 233(Java平台脚本)的实现。随着BSF变得非常有用,其背后的想法被简单地吸收到了Java平台规范中。 - Chucky
如果现在它是Java平台的一部分,那么如何在ANT中使用该功能? - ricosrealm
据我所知,框架的功能被吸收了,但语言本身没有。因此,您不能直接从平台使用Beanshell。 - Brett Kail

3

目前(2012年),您只需要一个jar文件即可启动BeanShell脚本任务:

之前我也考虑过以下内容,正如Ant手册中提到的Library Dependencies章节

但看起来在我的环境中,bsf对于bsh并不是必需的。

一旦将jar文件提供给ant,脚本任务就可以平稳运行。有两种可能的场景可以获取这些jar文件并使其对ant可用。

手动下载方式

下载上述jar文件。我提供了从maven repository获取链接。一旦您下载了所有的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自动下载方法

当您想要分发构建脚本时,手动方法并不完美。这时,您需要一种确保所需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}"/>
      <!-- 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>

1

Ant插件"org.apache.ant_1.7.0.v200803061910"包含所有需要的jar文件


1

不要使用beanshell语言。请改用javascript,因为它可以在jdk6上运行而无需任何额外的jar包。Rebse告诉我这个。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接