В настоящее время (2012 г.) вам понадобится всего 1 банка, чтобы запустить задачу скрипта для BeanShell:
Ранее я также думал о следующем, как упомянуто в Руководстве по Ant, Глава о библиотеках :
Но похоже, что bsf
не требуется для bsh
, по крайней мере, в моей среде.
Как только баночка передана муравью, задача скрипта запускается без проблем. Есть 2 возможных сценария получения банок и их доступности для муравья.
Способ загрузки вручную
Загрузите банки выше. Я предоставил ссылки из репозитория Maven. Как только вы скачаете все банки, сделайте их доступными для муравья. Есть
как минимум 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 . Айви загрузит банки и поместит их в 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>