# Junit-Programm von Kommandozeile über Ant starten



## Byron (18. Mrz 2011)

Guten Morgen zusammen!

Nachdem ich beim googlen und stöbern nicht weitergekommen bin, wende ich mich jetzt hier an die geballte Java-Kompetenz 

Mein Problem ist Folgendes:

Ich habe eine Klasse, die per JUnit ausgeführt wird und mir XML-Dokumente in ein Verzeichnis extrahiert.
Nun sollte diese XML-Ausgabe per Ant anstoßbar gemacht werden.
Am Besten sollte in der Kommandozeile dann über ant ein Befehl eingegeben werden können, der die Ausgabe bzw die Erstellung der XML-Docs startet (also quasi die JUnit-Klasse).
Ausserdem sollten Parameter übergeben werden können wie "-d" für directory und "-l" für level (anderes XML-Dokument wird ausgegeben).
Wie kann ich das alles in einer weiteren Klasse verwirklichen?

Ich hoffe mir kann jemand helfen.

Grüße


----------



## Wildcard (18. Mrz 2011)

Ant hat einen JUnit Task


----------



## Byron (19. Mrz 2011)

Danke für die Antwort.

Ich weiß dass Ant ein JUnit Task hat, aber meine neue Klasse soll ja nicht nur die JUnit-Klasse ausführen, sondern auch Methoden enthalten, die quasi über Ant Parameter geliefert bekommen.
Meine Klasse führt die JUnit-Klasse momentan in der main-Methode aus.
Es bleibt die Frage wie ich Parameter aus Ant in der Klasse verarbeiten kann?


----------



## Wildcard (21. Mrz 2011)

Gar nicht. Was hast du denn seltsames vor?
Schreib dir einen Ant Task.


----------



## Byron (23. Mrz 2011)

An eine Ant-Task hatte ich auch schon gedacht. Im Programmieren von Ant-Tasks hab ich noch keine Erfahrung, aber ich werd mich mal einlesen.
Mein Problem ist ja eigentlich, wie ich Parameter, die im build.xml als property stehen oder eben direkt eingegeben werden, in die Methoden aus meiner Klasse bekomme?!
Es soll nachher das Programm über die Kommandozeile ausgeführt werden können und das zu extrahierende File + das Verzeichniss in das extrahiert werden soll + Level (habe 2 verschiedene Extract-Methoden) als Parameter angegeben werden können ohne am Code etwas zu ändern.
Ich hoffe man versteht was ich meine und mir kann jemand helfen.

Grüße


----------



## Byron (23. Mrz 2011)

So!
Hab mich jetzt mal an die Ant-Lektüren gesetzt. Ich bin sehr positiv gestimmt, dass ich bald meine Vorstellung umgesetzt hab.
Zu den Parametern: Wenn man eine Ant-Task programmiert, kann man über getProject().getProperty() ein Property aus dem xml-File auslesen. Ich hoffe ich krieg es damit umgesetzt.
Danke schonmal für die Hilfe. Ich melde mich wenn ich weitergekommen bin oder wieder Hilfe brauch ;-)


----------



## Wildcard (24. Mrz 2011)

Direkt auf Properties des scripts zuzugreifen ist sehr ungünstig, aber du kannst einem Ant Task direkt Parameter setzen. Der Ant Task muss dazu lediglich getter und setter mit dem Namen des Parameters bereitstellen.


----------



## Byron (25. Mrz 2011)

Danke für die Antwort Wildcard.
Ich versteh nicht ganz wie du das meinst. Warum ist es ungünstig sich properties aus dem Script zu holen? Ich will die quasi in der Kommandozeile das Property (Bsp:dest.dir) vor jedem Extract setzen und mit der selbstprogrammierten Task dann quasi verwenden.


----------



## Gast2 (25. Mrz 2011)

Weil es undurchsichtig ist wenn der Task direkt auf eine Property zugreift. 

Besser ist es:
[XML]
<mytask
      parameter1 = "something"
      parameter2 = "somethingother"
/>
[/XML]
Dann musst du in der Klasse halt nur einen Setter "setParameter1" und "setParameter2" haben. 

Natürlich kannst du auch dann die Properties nutzen. Einfach im build.xml
[XML]
<mytask
      parameter1 = "${dest.dir}"
      parameter2 = "${build.dir}"
/>
[/XML]

Damit weiß jeder der das build file ließt das der Task die beiden Propertis benutzt und sie werden nicht "heimlich" aus dem Project gezogen.

Hier mal ein Beispiel was ich eben gemacht hatte:
http://www.java-forum.org/743215-post12.html


----------



## Byron (25. Mrz 2011)

Danke fassy, das sieht echt top aus :toll:
Ich habs jetzt vorerst wie oben beschrieben mit den properties als parameter realisiert.
Läuft einwandfrei! Bin echt froh dass es funktioniert hat.
Ich werd mir aber deine Variante noch genau anschaun und versuchen evtl diese noch umzusetzen.

Vielen Dank nochmal an alle! :applaus:

Grüße Byron


----------



## Byron (30. Mrz 2011)

Jetzt will ich mein extract möglichst ohne Abhängigkeit von Ant realisieren.
Das heisst, das meine Klassse nicht auf der Ant-Klasse aufbauen soll.
Hat jemand ne Idee wie ich das realisieren kann?

Grüße Byron


----------



## Byron (6. Apr 2011)

Kann mir niemand helfen? 
Ich brauch eigentlich nur einen groben Ansatz damit ich weiss wo ich mich einlesen sollte.


----------



## Wildcard (6. Apr 2011)

Ich verstehe dein Problem nicht. Wenn du die Funktionalität Ant Unabhängig haben willst, dann darfst du einfach nicht von Task erben.


----------



## Byron (7. Apr 2011)

Danke für die Antwort.
Dass ich nichts von der Ant-Lib verwenden darf ist mir klar. Aber wie kann ich dann über die Kommandozeile Parameter übergeben und diese in meiner Klasse verarbeiten?

Grüße


----------



## Gast2 (7. Apr 2011)

```
public static void main(String[] args){
  // args = deine Parameter
}
```

Du kannst auch gleich eine CLI Lib einsetzen:
http://www.java-forum.org/allgemeine-java-themen/115780-java-kommandozeilen-client.html


----------



## Byron (13. Apr 2011)

Danke fassy, aber ich verstehs nicht so wirklich.
Was soll ich dann in der Kommandozeile eingeben, damit die Parameter der auszuführenden Klasse diese bekommen?
Und wie verarbeit ich sie in der Methode selbst?
Eine andere Lib einzubinden fällt raus, weil ich möglichst wenig Abhängigkeit haben möchte und deswegen ja auch die Ant-Lib weg haben will.
Wär sehr dankbar für ne ausführliche Erläuterung. Ich hoff ich nerve nicht langsam 

Vielen Dank schonmal.

MfG Byron


----------



## Byron (13. Apr 2011)

Hi.
Habs jetzt soweit, dass die Kommandozeilenparameter verarbeitet werden.


----------



## Byron (20. Apr 2011)

...und täglich grüßt das Murmeltier (Byron) 

Hab jetzt das Problem, dass ich die Parameter nicht über Ant an mein Programm bekomm.

Hab es wie folgt versucht:
[XML]
<target name="extract" depends="compile">
		<java classname="Pakete...AntExtract" classpath="./bin" classpathref="classpath.full"/>
		<arg value="sourceFile" />
		<arg value="destination" />
	</target>
[/XML]

Hab es auch schon mit arg-list versucht, aber ohne Erfolg.
Folgendes Problem wird in der Kommandozeiel ausgegeben: "Problem: failed to create task or type arg."

Ich hoffe mir kann jemand von euch helfen!

Grüße vom Murmeltier ;-)


----------



## Byron (20. Apr 2011)

Entwickelt sich langsam zum Monolog 

Ich hab den Fehler gefunden. Für die, die es interessiert:

Die Argumente müssen logischerweise innerhlab des Java-Tasks stehen. Richtig also:

[XML]
<target name="extract" depends="compile">
        <java classname="Pakete...AntExtract" classpath="./bin" classpathref="classpath.full">
        <arg value="sourceFile" />
        <arg value="destination" />
        </java>
    </target>[/XML]


----------



## fastjack (20. Apr 2011)

Das ist whl. so, weil hier keiner versteht, was Du eigentlich vorhast.

Wenn Du Klassen testen möchtest, die eine main-Methode haben, dann kannst Du die Logik in der main-Methode in eine andere Klasse verlegen und diese dann ganz normal mit JUnit testen. Die main()-Methode selbst kannst Du ebenfalls durch JUnit testen. Du brauchst dann keinen eigenen Task, sondern kannst ganz einfach den von JUnit nutzen.


----------



## Byron (20. Apr 2011)

Danke fastjack!

Genau das habe ich ja jetzt gemacht. 
Die Klasse mit der Main-Methode diente nur zum Ausführen der eigentlichen Klasse, die ich eben schon mit Junit realisiert hattte.
Auf jeden Fall läufts jetzt wie ich das wollte.

Danke nochmals an alle für die Hilfe!

Gruß Byron


----------

