Как я могу указать путь к JAR в файле сборки ant? - PullRequest
8 голосов
/ 24 февраля 2011

Я выполняю партию scp и sshexec и другие удаленные команды из скрипта сборки ant.Эти команды не работают, если jsch.jar не находится в каталоге ant lib.Чтобы заставить его работать, я скопировал JAR в каталог ant lib, но это не очень хорошее решение, так как любой, кто хочет запустить скрипт, должен будет сделать то же самое.Чтобы запустить цель ant из Teamcity, нам нужно будет явно указать путь к файлу lib.

Есть ли способ указать путь JAR в самом XML-файле сборки ant?

Ответы [ 3 ]

5 голосов
/ 25 февраля 2011

Спасибо всем за ваши ответы.Мне удалось заставить его работать с задачей загрузчика классов.Это то, что я сделал.

<project basedir="." >
  <property environment="env"/>

  <taskdef resource="net/jtools/classloadertask/antlib.xml">
    <classpath>
      <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/>
    </classpath>
  </taskdef>

  <!--Add JSCH jar to the classpath-->
  <classloader loader="system">
    <classpath>
      <fileset dir="${basedir}/lib" includes="jsch*.jar"/>
      </classpath>
  </classloader>

  <target name="Test">
      <scp todir="user1:pass1@server1:/tmp" trust="true" >
        <fileset dir="dir1">
          <include name="test.txt" />
        </fileset>
      </scp>
   </target>
</project>

Как вы можете видеть здесь, мне не нужно было ставить какую-либо зависимую цель для моей цели "Тест", она просто работает.Он использует загрузчик классов, который добавляет jsch.jar в системный загрузчик классов.

2 голосов
/ 24 февраля 2011

Один из возможных способов обойти это - использовать параметр командной строки -lib, чтобы сообщить муравью, где искать дополнительные jar-файлы.Возможно, вы могли бы создать скрипт-обёртку, который вызывает ant с этой установленной опцией.

Другим способом было бы переместить файл ant-jsch.jar (это jar, который идет с ant, который определяет задачи, а неФайл jsch.jar, который необходимо загрузить отдельно), из каталога ant lib и создайте taskdef для вашей задачи ssh, отдельной от встроенной, затем установите для classpath для этой задачи значения jsch.jar и ant-jsch.jar:

<taskdef name="sshexec"
  classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec">
  <classpath>
    <pathelement location="jsch-0.1.44.jar"/>
    <pathelement location="ant-jsch.jar" />
  </classpath>
</taskdef>

Я не уверен, что это поможет вам, хотя это также включает внесение изменений в каталог lib.

Насколько я знаю, в настоящее время это не такможно указать дополнительные jar-файлы, необходимые для встроенных задач, в самом файле сборки в целом.Есть несколько особых случаев, например, junit.

1 голос
/ 24 февраля 2011

Чтобы ваша сборка стала более кроссплатформенной, я бы предложил использовать управление зависимостями.Плагин ivy может автоматически устанавливать версию плагина вашей сборки во время сборки.

Этот подход означает, что последний jar, который вам когда-либо понадобится установить в ANT lib, будет ivy-2.2.0.jar : -)

Сначала объявите зависимости вашего проекта в файле ivy.xml

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="anttask" description="Jars implementing ANT tasks"/>
    </configurations>
    <dependencies>
        <dependency org="com.jcraft" name="jsch" rev="0.1.42" conf="anttask->default"/>
    </dependencies>
</ivy-module>

Внутри вашего build.xml запустите ivy и используйте его для заполнения пользовательского пути к классу на основе конфигурации ivy:

<target name='init' description='Resolve project dependencies and set classpaths'>
    <ivy:resolve/>
    <ivy:cachepath pathid="anttask.path" conf="anttask"/>
</target>

Наконец, в других местах вашей сборки объявляйте задачи ANT, используя путь к классам, теперь автоматически заполняемыйплющом

<target name='dosomething' depends="init">
    <taskdef name="sshexec" 
             classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
             classpathref="anttask.path"/>
    ..
    ..
</target>

Этот подход работает для всех плагинов ANT, большинство из которых доступны в центральном репозитории Maven.Второе преимущество заключается в том, что версии плагинов можно легко обновить во всех сборках.

...