9
votes

Y a-t-il un moyen de spécifier l'emplacement d'un jsch.jar local de Build.XML?

build.xml contient et tâches, donc je fournis jsch.jar et autres bibliothèques dans le même répertoire avec Build.xml.

Le Taskdef suivant: xxx

jette une erreur xxx

Je ne peux pas modifier l'installation de fourmis standard (par exemple jsch.jar en ant lib répertoire, ou supprimer Ant-Jsch.jar) ou ajouter des indicateurs de ligne de commande ou modifiez Variables d'environnement système, etc.: Le script doit fonctionner avec une fourmi par défaut Sur différents systèmes.

Je repousse en fait la question posée à l'origine ici: http: //ant.1045680.n5.nébababé.com/specifiant-Location-Of-an-External-library-within-build-xml-td1344969.html

mais ne pouvait pas obtenir la réponse À propos du chargeur de classe au travail.


0 commentaires

7 Réponses :


0
votes

Créer une référence de chemin puis utilisez-le dans votre Définition de la tâche:

<path id="ssh.path">
   <pathelement location="${lib1.dir}/helloworld.jar"/>
   <fileset dir="${lib2.dir}">
       <include name="*.jar"/>
   </fileset>
</path>

<taskdef name="mytask" classname="org.mytask" classpathref="ssh.path" />


0 commentaires

17
votes

Enfin j'ai trouvé une solution de travail (pour la fourchette 1.7.1 au moins). Vous devez d'abord supprimer ant-jsch.jar code> à partir de ant_home / lib code> comme la plante se plaint de cela et est confuse. Puis chargez des bibliothèques du projet lui-même:

<available property="ant-jsch.present" file="${ant.home}/lib/ant-jsch.jar"/>
<fail if="ant-jsch.present" message="Please remove ant-jsch.jar from ANT_HOME/lib see [http://ant.apache.org/faq.html#delegating-classloader]"/>

<path id="jsch.path">
    <pathelement location="lib/ant-jsch.jar" />
    <pathelement location="lib/jsch-0.1.44.jar" />
</path>

<taskdef name="scp" classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp" classpathref="jsch.path" />
<taskdef name="sshexec" classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" classpathref="jsch.path" />


3 commentaires

Il semble que ce soit un problème courant et je pense que c'est la meilleure solution, sauf au lieu d'échouer, je vais simplement aller de l'avant et supprimer le /lib/ant-jsch.jar. Au cas où il aide les autres, Paulo donne une explication du problème de base dans son SO Réponse à une question SCP associée et Le même problème se produit avec Junit et est expliqué ici


Mais cela nécessite une modification de l'installation de fourmis standard.


J'ai eu lieu avec ce problème pendant des jours et cette solution est la seule à laquelle je pourrais aller travailler!



3
votes

Donc, cette question est ancienne, mais j'ai conçu une autre approche qui peut aider les autres. Nous pouvons frayer une fourmi d'un code> avec le point de classe approprié pour exécuter code>. Cela évite le problème de la fuite de classe de classe, et ne nécessite pas de changement d'installation de fourmis en aucune façon:

<ant target="sendfile">
    <!-- Example: send /etc/os-release file to remote dir /home/myself -->
    <property name="file" value="/etc/os-release"/>
    <property name="todir" value="/home/myself"/>
</ant>


0 commentaires

2
votes

Pour référence, une approche que je trouve utile est de reconditionner les pots, de sorte qu'ils ne sont pas en conflit - vous pouvez le faire dans la fourmi en utilisant Jarjar comme ceci:

<taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="${basedir}/lib/build/jar/jarjar-1.4.jar"/>

<taskdef name="scp" classname="repackaged.scp.org.apache.tools.ant.taskdefs.optional.ssh.Scp" classpath="${basedir}/lib/build/jar/repackaged-scp.jar"/>

<target name="repackage.scp" description="Repackages Ant's optional SCP task and the JSch implementation to avoid conflicting with one on Ant's classpath">
    <delete file="${basedir}/lib/build/jar/repackaged-scp.jar" failonerror="false"/>
    <jarjar basedir="." jarfile="${basedir}/lib/build/jar/repackaged-scp.jar" includes="nothing">
        <zipfileset src="${basedir}/lib/build/jar/ant-jsch-1.9.1.jar"/>
        <zipfileset src="${basedir}/lib/build/jar/jsch-0.1.50.jar"/>
        <rule pattern="com.jcraft.jsch.**" result="repackaged.scp.com.jcraft.jsch.@1"/>
        <rule pattern="org.apache.tools.ant.taskdefs.optional.ssh.**" result="repackaged.scp.org.apache.tools.ant.taskdefs.optional.ssh.@1"/>
    </jarjar>
</target>


0 commentaires

0
votes

créer ~ / .ant / lib code> et copiez jsch.jar code> dans ce cadre dans la partie de l'initialisation de la construction.

<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>


0 commentaires

1
votes

J'ai pu résoudre ce problème après la poste d'ici https://stackoverflow.com/a/858744/3499805 puis xxx


0 commentaires

0
votes

Il y a un astuce avec urlclassloader . En l'utilisant, nous pouvons faire jsch accessible à ant-jsch .

Je me demande comment classLoaderTask de la réponse par @ user3499805 fonctionne. < / p> xxx

_ xxx


0 commentaires