Проблемы с Ant необязательные задачи SSHExec и SCP. Проблема с classpath? - PullRequest
1 голос
/ 27 апреля 2011

Я нахожусь в процессе изменения сценария Ant (который в настоящее время используется из MyEclipse) для работы из командной строки.Я делаю это, чтобы любой мог проверить проект и собрать его без MyEclipse.Проблема, с которой я сталкиваюсь, заключается в том, что MyEclipse включает закулисные зависимости.Это делается путем просмотра конфигурации Ant рабочей области и компиляции пути к классам на основе выбранных библиотек в диалоговом окне настроек.Короче говоря, мне нужно взять эти зависимости и сделать скрипт достаточно умным, чтобы включать их самостоятельно, без помощи MyEclipse.

Задачи, от которых у меня болит голова, - это задачи sshexec и scp.Это необязательные задачи ant, для работы которых требуется версия jsch.Я удалил jsch из пути к классам Ant в MyEclipse и добавил его в папку lib в самом проекте (lib / dev).MyEclipse немедленно пожаловался, что класс SSHExec не смог найти зависимый класс com.jcraft.jsch.UserInfo, который является частью jsch-0.1.44.jar.

Я не вижу способа установить путь к классу для Ant изнутрискрипт сборки.У меня есть следующий код, который добавляет элемент path в сценарий, но я не думаю, что Ant использует его, если явно не связан с задачей или другим элементом.

<path id="web-jars">
  <fileset dir="${web-lib}">
    <include name="**/*.jar" />
  </fileset>
  <fileset dir="${app-lib}"> <!-- this is where jsch resides --> 
    <include name="**/*.jar" />
  </fileset>
</path>

Кажется, что мне нужночтобы использовать taskdef для определения задач sshexec и scp:

<taskdef name="sshexec" classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
    classpathref="web-jars"/>

MyEclipse жалуется на это, "taskdef A class needed by class org.apache.tools.ant.taskdefs.optional.ssh.SSHExec cannot be found: com/jcraft/jsch/UserInfo"

Это явно в classpathref, web-jars.И я не могу ничего запустить в скрипте из-за этой некорректной или неправильно сконфигурированной задачи.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Проблема здесь в том, что класс SSHExec загружается из загрузчика классов, который сам по себе не имеет доступа к загрузчику классов web-jars. Предоставление этого classpath для taskdef не меняет этого. Каждый класс может загружать классы только из своего собственного загрузчика классов и любых родительских загрузчиков классов, но загрузчик классов web-jars не является загрузчиком родительского класса загрузчика классов SSHExec (скорее всего, наоборот, так как SSHExec, кажется, находится здесь).

Это выглядит так:

 ClassLoader    web-jars  ------------->   application CL ------------->  bootstrap CL

 taskdef 
       =>   look for SSHExec here
            => look first in parent class loader
                                     => look for SSHExec here
                                     => look first in parent class loader
                                                                     => look for SSHExec here
                                                                     => not found
                                     => look in our own classpath
                                     => found, load the class
                                     => it somehow uses interface UserInfo
                                     => look for UserInfo here
                                     => look first in parent class loader
                                                                    => look for UserInfo here
                                                                    => not found
                                     => look in our own classpath
                                     => not found, throw exception.

Виртуальная машина не имеет представления, что искать UserInfo (и другие классы JSch) в загрузчике классов web-jars.

Я полагаю, что задача SSHExec находится где-то в обычном пути к муравьям, т.е. загружается загрузчиком классов приложения. Тогда удаление SSHExec из пути к муравьям (или добавление jsch.jar к нему) кажется единственным решением здесь.

0 голосов
/ 08 августа 2016

Создайте ~ / .ant / lib и скопируйте туда jsch.jar как часть инициализации сборки. Любые задачи, выполняющие scp / sshexec, должны зависеть от этой цели init.

<target name="init">
  <property name="user.ant.lib" location="${user.home}/.ant/lib"/>
  <mkdir dir="${user.ant.lib}"/>
  <copy todir="${user.ant.lib}">
    <fileset dir="${basedir}/build/tools" includes="jsch-*.jar"/>
  </copy>
</target>

<target name="mytarget" depends="init">
  <scp todir="user@host"><fileset dir="..."/></scp>
</target>

Ant в Eclipse, к сожалению, не подхватит это сразу, так как не читает ~/.ant/lib при каждом выполнении; После однократного запуска mytarget в Eclipse и наблюдения за ним, затем перейдите к: Window> Preferences> Ant> Runtime и нажмите Restore Defaults - это добавит любые файлы .jar из ~/.ant/lib в раздел Global Entries , и вы должны быть хорошо идти.

...