2010-12-22 14 views
9

Ich definiere eine neue Aufgabe in Ant. ich es als ein Glas exportiert und zu meinem Buildfile:Klassenpfad für Taskdef?

<taskdef classname="X" classpath="Y.jar"/> 

Das Problem ist, dass diese zur Laufzeit ausfällt. Es sagt mir, dass es die Klasse nicht gefunden hat. Durch Hinzufügen des Glases zum Klassenpfad wird es korrigiert.

Meine Frage ist: Gibt es eine Möglichkeit, dass ich aus dem Ant-Buildfile auf mein Jar verweisen kann, ohne den Klassenpfad zu ändern?

Antwort

1

Ja. Ich gehe davon aus, dass Sie sich die doc für taskdef angesehen haben, die nur den Namen der Aufgabe und die implementierende Klasse zeigt. Allerdings taskdef Unterklassen typedef, und wenn Sie auf die doc für die letzteren schauen, werden Sie sehen, dass es auch ein classpath Attribut gibt.

JEDOCH, mit diesem Attribut bedeutet, dass Ihre Ant-Skripte an eine bestimmte Umgebung gebunden sind; Sie sind nicht sehr tragbar. Ein weitaus besserer Ansatz besteht darin, den Klassenpfad unter Verwendung der -libinvocation option in Ant zu überführen.

+2

Und wenn Sie eine 'CLASSPATH' Umgebungsvariable verwenden, nicht. Löschen Sie es aus Ihrer Umgebung, und gewöhnen Sie sich an, Klassenpfade explizit anzugeben. Andernfalls werden Sie sich mit einem schwer zu debuggenden Problem konfrontiert sehen, bei dem eine Bibliothek aus Ihrem Klassenpfad geladen wird und Sie dies nicht erwarten. Oder jemand anders kann Ihren Code nicht ausführen, weil er nicht dieselbe Umgebungsvariable CLASSPATH hat. – Anon

+3

Ich sehe nicht, warum das ein weitaus besserer Ansatz ist. Das Angeben der Klassenpfade mit der Option "-lib" macht den Benutzer nur auf diese Pfade aufmerksam. Sie müssen dem Benutzer immer noch mitteilen, wo er nach ihnen suchen soll (z. B. in einer Infodatei, in einer Hilfedatei oder in einer zurückgesendeten Nachricht). Oder Sie können Ihre Projektverzeichnishierarchie so umstrukturieren, dass diese Bibliotheken in einem bestimmten Unterverzeichnis enthalten sind und "umweltunabhängig" werden. Ein Build-Skript sollte sich um diese Details kümmern und idealerweise ein sinnvolles Objekt mit dem Standardaufruf "ant" erzeugen. – Alberto

8

Wenn Sie den Pfad Ihres Glases kennen, können Sie innerhalb des Ameisen-Skripts den Klassenpfad für Ihre eigene Aufgabe definieren.

<taskdef name="myTaskName" classname="com.myorg.myclass"> 
    <classpath> 
    <pathelement location="pathToMyJar.jar"/> 
    </classpath> 
</taskdef>