Blog

Verwaltung von Abhängigkeiten in FitNesse mit Apache Ivy

Arjan Molenaar

Aktualisiert Oktober 22, 2025
5 Minuten

In einem Softwareprojekt ist die Verwaltung von Abhängigkeiten eine gängige Praxis. Wie sieht es also mit der Verwaltung von Abhängigkeiten in Ihrer FitNesse-Abnahmetestsuite aus?

In meinem letzten Beitrag habe ich erklärt, wie Sie FitNesse und Maven zusammenarbeiten lassen können. Wenn Sie nicht mit Maven arbeiten, aber (Java-)Projektabhängigkeiten auf bequeme Weise handhaben möchten, verwenden Sie wahrscheinlich Ivy. Ivy wird von Gradle und SBT unter der Haube verwendet, ist aber standardmäßig nicht in den Paketen von Ant enthalten. Es ist ein nettes Tool, das das Abhängigkeitsmanagement sehr gut beherrscht. Es ist mit den POM-Dateien von Maven kompatibel: Es kann sie sowohl lesen als auch schreiben. In diesem Beitrag werde ich Ant als Grundlage verwenden.

Ant hat im Gegensatz zu Maven keinen festen Satz von Phasen. Obwohl dies Ihre Build-Skripte sehr kompliziert machen kann, ermöglicht es eine große Flexibilität.

Kurz gesagt:

  • Die Verwaltung von Abhängigkeiten ist mit Ant einfach genug.
  • Ant lässt Ihnen alle Freiheiten, das Gebäude so zu gestalten, wie Sie es möchten.
  • Ivy legt keine Beschränkungen für die Anzahl der Abhängigkeitskonfigurationen fest, so dass wir eine feinkörnige Abhängigkeitsverwaltung durchführen können.

Aktivieren Sie die Abhängigkeitsverwaltung in Ant

(Wenn Sie Ant nicht verwenden, fahren Sie einfach fort).

Die erste Herausforderung besteht also darin, Ivy von Ant aus zu aktivieren. Sie können nicht von jedem erwarten, dass er Ivy von Hand installiert, bevor er überhaupt mit der Erstellung Ihrer Anwendung beginnt. Zum Glück kann Ivy relativ einfach von Ant aus gestartet werden:

[sourcecode lang="xml"]<project name="Fitnesse" default="all" basedir="." xmlns_ivy="antlib:org.apache.ivy.ant"> <!-- Alle Ihre Aufgaben kommen hierher. -- --> <!-- Boilerplate für die Verwaltung von Abhängigkeiten: --> <property name="maven.central.url" value="https://repo2.maven.org/maven2"/> <available file="antlib/ivy.jar" type="file" property="have.ivy.jar"/> <target name="ivy-init" depends="ivy-download"> <path id="ivy.class.path"> <fileset dir="antlib"> <include name="*.jar"/> </fileset> </path> <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.class.path" /> </target> <target name="ivy-download" unless="have.ivy.jar"> <mkdir dir="antlib" /> <get src="${maven.central.url}/org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar" dest="antlib/ivy.jar" usetimestamp="true" verbose="true" /> </target> </project> [/sourcecode]

Ivy kann im Maven Central Repository gefunden werden. Das macht das Leben sehr viel einfacher. Das obige Snippet lädt Ivy bei Bedarf herunter(ivy-download target) und initialisiert Ivy-Tasks(ivy-init). Die Ivy-Aufgaben werden im Namespace antlib:org.apache.ivy.ant initialisiert, der auf den ivy-Namespace-Präfix abgebildet wird. Es ist schließlich alles XML.

Ziele, die Abhängigkeitsinformationen benötigen, sollten vom ivy-init-Ziel abhängen.

Ivy muss über die Repositories Bescheid wissen. Standardmäßig kennt es das zentrale Maven2-Repository nicht, so dass Ivy mitgeteilt werden muss, wo es sich befindet. Dies kann in ivysettings.xml erfolgen:

[sourcecode lang="xml"]<ivysettings> <Einstellungen defaultResolver="default" /> <Auflöser> <chain name="standard"> <ibiblio name="maven2" root="https://repo2.maven.org/maven2" m2compatible="true" /> </chain> </resolvers> </ivysettings> [/sourcecode]

Schließlich die Datei ivy.xml selbst. Ivy hat keinen vordefinierten Satz von Stufen, so dass Sie jede beliebige Konfiguration erstellen können, wobei Standard die Standardkonfiguration ist.

[sourcecode lang="xml"]<ivy-module version="2.0"> <info organisation="org.example" module="example" /> <Konfigurationen> <conf name="default" visibility="public" /> <conf name="fitnesse" visibility="private" extends="default" description="Konfiguration für den Start von FitNesse" /> <conf name="acceptance" visibility="public" extends="default" description="Konfiguration zum Starten von Akzeptanztests aus FitNesse" /> </configurations> <Abhängigkeiten> <!-- Projekt-Abhängigkeiten --> <dependency org="org.fitnesse" name="fitnesse" rev="20130530" conf="fitnesse->default, acceptance->default" /> </dependencies> </ivy-module> [/sourcecode]

Hier werden die speziellen Konfigurationen fitnesse und acceptance erstellt. Diese Konfigurationen entsprechen der Standardkonfiguration von FitNesse.

Starten Sie FitNesse von Ant

Um unsere Konfiguration von Ant zu verwenden, tue ich das:

[sourcecode lang="xml"]<project name="Fitnesse" default="all" basedir="." xmlns_ivy="antlib:org.apache.ivy.ant"> <target name="run-fitnesse" depends="resolve"> <ivy:cachepath pathid="fitnesse.classpath" conf="fitnesse" /> <java classpathref="fitnesse.classpath" classname="fitnesseMain.FitNesseMain" fork="true" failonerror="true"> <arg value="-p" /> <arg value="${fitnesse.port}" /> </java> </target> <target name="auflösen" depends="ivy-init"> <ivy:resolve /> </target> ... </project> [/sourcecode]

FitNesse kann nun von Ant aus gestartet werden, mit dem Befehl ant run-fitnesse.

Keine Verwendung von Ant

Falls Sie SBT verwenden, kann das Tool eine ivy.xml aus seinem eigenen Build-Format generieren, obwohl ich das nicht selbst ausprobiert habe. Die generierte Datei kann als Eingabe für das fitnesse-ivy-classpath Plugin verwendet werden. Für Gradle ist ein separates Plugin verfügbar.

Ivy-Unterstützung in FitNesse

Der Umgang mit Ivy-Abhängigkeiten in FitNesse ähnelt dem Umgang mit Maven-Abhängigkeiten in FitNesse: Binden Sie ein Plugin ein, das diese Unterstützung bietet.

Im Falle von Ivy gibt es das Plugin fitnesse-ivy-classpath. Fügen wir es in unsere ivy.xml ein:

[sourcecode lang="xml"]<dependency org="org.fitnesse.plugins" name="fitnesse-ivy-classpath" rev="0.1" conf="fitnesse->default"/> [/sourcecode]

Wir müssen FitNesse mitteilen, dass wir den Befehl aus dem Plugin zu FitNesse hinzufügen möchten. Fügen wir eine plugins.properties mit dem folgenden Inhalt hinzu:

[sourcecode] SymbolTypes = fitnesse.wikitext.widgets.IvyClasspathSymbolType [/sourcecode]

Starten Sie FitNesse und der neue "Symboltyp" wird angezeigt:

  run-fitnesse:
  FitNesse (v20121220) Gestartet...
  Hafen: 9000
  Stammseite: fitnesse.wiki.FileSystemPage unter ./FitNesseRoot
  Logger: keine
  Authentifikator: fitnesse.authentication.PromiscuousAuthenticator
  Seitenfabrik: fitnesse.responders.PageFactory
  Thema der Seite: bootstrap
  Ablauf der Seitenversion auf 14 Tage eingestellt.
  Benutzerdefinierte Symboltypen geladen:
  fitnesse.wikitext.widgets.IvyClasspathSymbolType

Erinnern Sie sich, dass wir eine spezielle Konfiguration für Akzeptanztests definiert haben? Das Plugin kann so konfiguriert werden, dass nur das verwendet wird, was für Akzeptanztests erforderlich ist. Fügen Sie in einer (neuen) Wikiseite die folgende Zeile ein:

[sourcecode lang="xml"]!resolve -c Akzeptanz ivy.xml [/sourcecode]

Dadurch werden die Abhängigkeiten für die Konfiguration "Akzeptanz" aufgelöst. Laden Sie die Wiki-Seite neu und Sie werden FitNesse (und seine Abhängigkeiten) sehen.

Fazit

Die Verwaltung von Abhängigkeiten von FitNesse für Ihr (Java-)Projekt ist nicht schwer. Ich würde es auf jeden Fall empfehlen. Sie ersparen sich eine Menge Ärger, wenn Sie Ihr Projekt entweder mit Maven oder Ant+Ivy erstellen und dabei dieselben Standards verwenden, die Sie auch für Ihre anderen Softwaremodule verwenden.

Verfasst von

Arjan Molenaar

Contact

Let’s discuss how we can support your journey.