Beanshell в Ant приводит к «Невозможно создать движок сценариев javax для beanshell» - PullRequest
9 голосов
/ 27 апреля 2010

Приветствие, я пытаюсь вставить какой-нибудь скрипт Beanshell в мой файл Ant build.xml. Я следовал руководству по Ant как мог, но продолжаю получать сообщение «Невозможно создать движок сценариев javax для beanshell» при запуске Ant. Вот цель теста, которую я написал в основном из примеров в руководстве по 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>

Мой бобовый файл "bsh-2.0b4.jar" находится в пути к классам задачи сценария, как рекомендовано руководством. Надеюсь, у меня есть правильный файл. Я сейчас работаю в c: \ TEMP. Я гуглил и пытался некоторое время сейчас. Любые идеи очень приветствуются. Спасибо.

Ответы [ 4 ]

6 голосов
/ 27 апреля 2010

Для начала вам нужен 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, похоже, тоже работал, но он напечатал сообщение, которое подразумевало, что он был экспериментальным.

2 голосов
/ 29 сентября 2012

В настоящее время (2012 г.) вам понадобится всего 1 банка, чтобы запустить задачу скрипта для BeanShell:

Ранее я также думал о следующем, как упомянуто в Руководстве по Ant, Глава о библиотеках :

Но похоже, что bsf не требуется для bsh, по крайней мере, в моей среде.

Как только баночка передана муравью, задача скрипта запускается без проблем. Есть 2 возможных сценария получения банок и их доступности для муравья.

Способ загрузки вручную

Загрузите банки выше. Я предоставил ссылки из репозитория Maven. Как только вы скачаете все банки, сделайте их доступными для муравья. Есть как минимум 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 . Айви загрузит банки и поместит их в classpath для вас. Проблема в том, что появляется другая зависимость, которая сама по себе является плющом. Но обеспечить ivy.jar довольно просто, и это последняя зависимость, которую мы должны предоставить явно.

Кто-то может спросить, зачем указывать ivy.jar, тогда как мы можем просто загрузить bsh.jar таким же образом. Ответ - гибкость. Если у вас есть ivy.jar, вы получите любой банку, который пожелаете, добавив его в файл ivy.xml за один шаг. И существует согласованное универсальное расположение для файла ivy.jar, в то время как для другого файла нам нужно будет найти подходящий каталог.

Ниже приведен полный пример, который загружает плющ, а затем все необходимые зависимости. Сценарий загрузки Ivy основан на главе установки справочника Ivy . Затем необходим простой файл ivy.xml, который дается после образца build.xml.

Оригинальный скрипт ivy для автоматической загрузки имеет недостаток, заключающийся в постоянной проверке URL-адреса плюща, даже если ivy.jar уже находится в ожидаемом месте. Это можно переопределить, указав -Doffline=true. Я предпочитаю добавить другую цель в файл сборки и выполнять проверку http, только если у нас еще нет 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>
1 голос
/ 30 сентября 2012

Не используйте beanshell язык. Вместо этого используйте javascript, поскольку он работает на jdk6 без каких-либо дополнительных jar-файлов. Ребсе сказал мне это.

Javascript также разрешено использовать Java-классы, например java.lang.System.out.println()

1 голос
/ 22 июня 2010

Плагин Ant "org.apache.ant_1.7.0.v200803061910" содержит все необходимые файлы jar

...