2009-01-23 4 views
16

Ich möchte die FTP-Aufgabe in ant verwenden, und ich habe die entsprechenden JAR-Dateien gefunden und alles funktioniert gut. Ich habe die JAR-Dateien in einem "libs" -Verzeichnis neben den anderen im Build verwendeten Dateien abgelegt. Das einzige Problem ist, dass der Benutzer "ant -lib commons-net-ftp-2.0.jar" ausführen muss, um einen Build zu erstellen. Ich würde wirklich bevorzugen, dass es möglich wäre, "ant" ohne Argumente zu starten.Wie lade ich eine optionale Aufgabe in ant ohne -lib oder globale Installation?

Ich lese die ant optional tasks intallation page, ich sehe, dass es fünf Möglichkeiten gibt, wie man zusätzliche Bibliotheken in Ameisen laden kann, und keiner von ihnen ist wirklich, was ich suche. Ich möchte den Benutzer nicht zwingen, Änderungen an seinem System vorzunehmen, um diese Aufgabe auszuführen. Es sollte möglich sein, es einfach aus dem Verzeichnis "libs" im Quellordner unseres Produkts zu laden. Das bedeutet also, dass der globale CLASSPATH ebenfalls deaktiviert ist (was sowieso eine schlechte Idee ist).

Die letzte Option, wie in der Dokumentation erwähnt, ist der bevorzugte Ansatz ... Laden Sie die JAR-Dateien einzeln aus dem Build-Skript selbst. Ich habe das in der Vergangenheit mit den ant-contrib-Aufgaben und JUnit gemacht und möchte das hier tun, aber ich sehe nicht, wie ich das erreichen kann. Der FTP-Task unterstützt kein verschachteltes Klassenpfadelement und ich kenne die XML-Ressource nicht, die ich diese Bibliothek über einen Taskdef laden müsste. Wie kann ich die Bibliotheken aus ant laden?

Edit: Als Antwort auf die Antworten und Fragen, die bisher hier gepostet wurden, verwende ich die Ameise 1.7.1. Einen ftp Taskdef zu machen funktioniert definitiv nicht; dass führt den folgenden Fehler:

BUILD FAILED /my/path/build.xml:13: taskdef Klasse org.apache.tools.ant.taskdefs.optional.net.FTP nicht

Vielleicht finden liegt daran, dass der Klassenname falsch ist. Wie genau finde ich den Klassennamen, den ich verwenden soll, wenn ich nur eine JAR-Datei habe? Es ist nirgends dokumentiert, und ich konnte nichts in dem Glas selbst finden, das diesem Pfad ähnelte.

+0

Ich dachte, dass eine andere Aufgabe, von der das FTP abhängig war, tun würde, aber ich bin mir nicht so sicher - das muss ich ausprobieren. – jim

+0

Das gleiche für mich. Bei externen Aufgaben schließe ich normalerweise einen Klassenpfad im Taskdef ein, aber mit einigen internen optionalen Aufgaben (ssh, scp, scriptdef) habe ich keine bessere Lösung gefunden, als den Benutzer die JARs nach /home/.ant/lib kopieren zu lassen: -S – Olivier

+0

Welche Version von Ant verwenden Sie? – jim

Antwort

12

Das Problem, das Sie haben werden, ist aufgrund der unterschiedlichen Klassenlader im Einsatz. Die Commons-Net-Klassen müssen von demselben Klassenlader geladen werden, der die FTP-Task lädt. Da der FTP-Task beim Start von Ant geladen wird, müssen Sie das Commons-Net zum Klassenpfad von Ant hinzufügen, damit es von demselben Klassenlader geladen wird. Aus diesem Grund gibt es in der Dokumentation vier verschiedene Möglichkeiten, dies zu tun.

Ich stimme zu, dass keine von ihnen ideal ist (die Umgebungsvariable CLASSPATH ist die schlechteste). Eine Möglichkeit besteht darin, ein Shell-Skript mit Ihrem Projekt bereitzustellen, das Ant aufruft und das entsprechende Argument -lib übergibt. Sie erhalten dann Leute, die dies verwenden, anstatt Ant direkt aufzurufen. In der Tat könnte man es auch "ant" nennen, so dass es anstelle des vorhandenen "ant" auf dem Pfad ausgeführt wird (dies funktioniert nur, wenn das aktuelle Verzeichnis auf dem Pfad vor anderen Verzeichnissen liegt).

Die fünfte Option in der Dokumentation ist in der Theorie groß. Sie haben schließlich die Klassenladeprobleme in 1.7.0 behoben. Leider, wie Sie erwähnen, hat niemand die FTP-Aufgabe nachgerüstet, um einen Klassenpfad zu nehmen. Sie könnten versuchen, eine Verbesserungsanfrage einzureichen, aber das wird kurzfristig nicht helfen.

Es gibt eine andere Option, die nicht besser als die anderen ist. Anstatt sicherzustellen, dass die Commons Net-Klassen vom Klassenlader geladen werden, der den FTP-Task lädt, können Sie sicherstellen, dass der FTP-Task vom Klassenlader geladen wird, der die Commons Net-Klassen lädt. Um dies zu tun, müssen Sie die Datei ant-commons-lib.jar aus dem Verzeichnis 'lib' der Ant-Installation entfernen. Dies bedeutet, dass der FTP-Task beim Start nicht geladen wird. Dies ist der Grund, warum die optionalen Aufgaben in so viele separate JARs aufgeteilt sind, dass sie einzeln entfernt werden können. Fügen Sie diese JAR-Datei der Commons Net JAR-Datei hinzu, damit sie gleichzeitig geladen werden kann. Dann können Sie etwas tun (ich versuchte dies und es funktioniert):

<taskdef name="ftp" 
     classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> 
    <classpath> 
    <pathelement location="${basedir}/lib/ant-commons-net.jar"/> 
    <pathelement location="${basedir}/lib/commons-net-2.0.jar"/> 
    </classpath> 
</taskdef> 
<ftp server="yourserver.com" 
    userid="anonymous" 
    password="blah"> 
    <fileset dir="somedirectory"/> 
</ftp> 

Aber das ist wahrscheinlich eine schlechtere Option als nur die -lib Schalter (mit oder ohne Wrapper-Skript). Die einzige andere Sache, die ich mir vorstellen kann, ist zu versuchen, eine FTP-Aufgabe eines Drittanbieters anstelle des Standard-FTP-Tasks zu finden.

+1

Danke für die detaillierte Erklärung hier .. das funktioniert in der Tat, obwohl wiederum erfordert es eine Änderung der Standardinstallation, die weniger als ideal ist. Ich schätze, anstatt dass unsere Benutzer ant-commons-net aus ihrem antit-lib-Verzeichnis entfernen, lassen wir sie commons-net-2.0-ftp hinzufügen. –

0

Ihre Benutzer haben alle Ameisen auf ihren Maschinen installiert, aber Sie können/wollen nicht, dass sie das FTP-Glas hinzufügen? Kannst du Ameisen mit deinem Projekt bündeln, um Aufgaben zu machen, die dein Ameisenbündel nennen, mit den Gläsern, so dass es wie folgt funktioniert?

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> 
    <classpath> 
    <pathelement location="\lib\commons-net-1.4.0.jar"/> 
    </classpath> 
</taskdef> 
<target name="testFtp"> 
    <ftp server="blah" userid="foo" password="bar"> 
    <fileset file="test.file" /> 
    </ftp> 
</target> 
+2

Ja, aber "Ich möchte den Benutzer nicht zwingen, Änderungen an seinem System vorzunehmen, um diese Aufgabe auszuführen" ist eine Voraussetzung. – jim

+0

Ah, ich habe die Frage falsch gelesen. Die Gläser sind in seinem Projekt lib! – Instantsoup

0

Wird diese Arbeit Libs Annahme ist direkt unter Ihnen Projektbasisverzeichnis

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> 
    <classpath> 
    <pathelement location="${basedir}\libs\commons-net-1.4.0.jar"/> 
    </classpath> 
</taskdef> 
+1

Soweit ich weiß, funktioniert das nicht. – Instantsoup

6

Ich habe eine Lösung:

Sie eine neue „Classloader“ Aufgabe von http://enitsys.sourceforge.net/ant-classloadertask/ herunterladen und laden Sie es whith:

<taskdef resource="net/jtools/classloadertask/antlib.xml" 
      classpath="XXX/ant-classloadertask.jar"/> 

Naw Dinge wie das Laden von Klassen mit dem gleichen Klassenlader tun können, die Ameise Verwendung für seine Aufgabe:

<classloader loader="system" classpath="XXX/commons-net-2.0.jar"/> 

oder "loader =" Projekt ""

Dann definde Sie Ihre Aufgabe:

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/>  

und gehen :-)

+1

Es funktioniert perfekt! Der einzige Punkt ist, dass Sie Ihre Ameise auf 1.8.1 aktualisieren müssen, um zu arbeiten. – ruyadorno

4

Also ich tue das für die Ameisen salesforce.jar gelang es, die Sie erhalten, wenn Sie versuchen Salesforce Arbeit (Spaß zu tun ...)

überprüfen sie, ob das Glas eine xML-Datei in es hat, dass etwas wie folgt aussieht:

<antlib> 
    <typedef name="compileAndTest" classname="com.salesforce.ant.CompileAndTest"/> 
    .... 
</antlib> 

Dann ist es in Ameise eine taskdev geben, die aus dem Inneren des gegebenen Glas, wie t die Datei liest sein:

<taskdef resource="com/salesforce/antlib.xml" classpath="lib/ant-salesforce.jar" /> 

Hoffe, dass das hilft.

1

Ah, Mann, das ist nur so gemein. Ich laufe eine Ameise vor der Sonnenfinsternis. Ich will Ameisen nicht in Eclipse für neue Arbeitsbereiche neu konfigurieren, also habe ich mich dazu entschlossen, die Ausführung der Aufgabe zu entkoppeln und Ameisen zu konfigurieren. Ich habe die FTP-Aufgabe in eine separate Build-Datei extrahiert. Als nächstes habe ich in die Befehlszeile einen nativen Aufruf einen völlig neuen ant Prozess mit den erforderlichen Bibliotheken auf dem Weg zu starten:

<target name="deploy-ftp"> 
    <exec command="ant"> 
     <arg line="-buildfile ftp.xml deploy-ftp -lib lib/ant"/> 
    </exec> 
</target> 

Nun kann die Master-Build-Datei ohne besondere Argumente und keine Änderungen erforderlich sind, ausgeführt werden die Ameisen-Installation. Es ist jedoch gemein, da die FTP-Aufgabe in einer völlig sauberen Umgebung ausgeführt wird. Keine der Eigenschaften und Pfade von der Master-Build-Datei sind verfügbar. Zum Glück hatte ich alle diese Dinge in einer separaten Eigenschaftendatei, also brauchte ich nur einen einzigen Import.

Ich möchte Dan Dyer ganz herzlich danken. Ohne Ihre ausführliche Erklärung dessen, was hinter den Kulissen vor sich geht, hätte ich diese Lösung nicht gefunden.

Verwandte Themen