Gabi und Sascha
Tags - Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Softwareentwickler sind faul. Das heisst allerdings nicht, dass sie schlampig sind und unordentlich arbeiten. Allerdings schiessen sie manchmal über das Ziel hinaus.

Am Wochenende habe ich an einem kleinen privaten Projekt programmiert. Dabei kommt die Apache Commons Chain API zum Einsatz. Sehr löblich ist, dass das Projekt mit Maven gebaut wird und im zentralen Maven-Repository liegt. Leider kommt Maven 1 im Commons Chain Projekt zum Einsatz. Ich selbst setze Maven 2 ein. Und damit begannt das kleine Problem.

Das Commons Chain Projekt bietet bereits eine Anzahl von Commands an. Diese betreffen zu einem grossen Teil Kommandos für Web-Projekte. Mit den Commands kann ich zwar nichts anfangen - ich spiele an einem Swing-Client - sie stören mich aber auch nicht. Um die Web-Commands übersetzten zu können sind die Servlet- und die Portlet API in das Projekt eingebunden. Neben diesen allerdings auch das MyFaces-Projekt. Das schicke neue Feature von Maven 2, transitive Abhängigkeiten aufzulösen, bewirkt bei meinem kleinen Projekt jetzt allerdings, dass ich mir alle Abhängigkeiten von MyFaces eingefangen gabe. Definitiv über das Ziel hinaus geschossen. Dabei wird MyFaces nur eingebunden, um den JSF FacesContext ein zu binden.

Aber Maven 2 bietet Möglichkeiten, das Problem zu umgehen. In einer Dependency-Beschreibung können weitere Abhängigkeiten ausgeschlossen werden. Mittels

        <dependency>
            <groupId>commons-chain</groupId>
            <artifactId>commons-chain</artifactId>
            <version>1.1</version>
            <exclusions> 
                <exclusion> 
                     <groupId>myfaces</groupId> 
                     <artifactId>myfaces-api</artifactId> 
                </exclusion> 
            </exclusions>
        </dependency>

wird die Abhängigkeit zu MyFaces und seinen weiteren Abhängigkeiten, aus dem aktuellen Projekt entfernt.

Dies ist nicht unbedingt der Weisheit letzter Schluss. Besser als das Abhängigkeiten System in Maven 1 ist es allemal. Die langen, in Maven 1 gepflegten Abhängigkeitenlisten sind damit ersetzt worden, durch kurze Ausschlussregeln. Dabei darf nicht verschwiegen werden, dass das Konfigurationsmanagement jetzt komplexer wird. Der Konfigurationsmanager muss die transitiven Abhängigkeiten auflösen, damit die Artefakte in das eigene Repository übernommen werden können. Dies lässt sich allerdings durch Werkzeuge unterstützen. Wichtig ist immer darauf zu achten, dass das eigene Repository sauber konfiguriert ist. Auf Repositories im Internet darf sich ein gewissenhafter Konfigurationsmanager nicht verlassen.


Proxies to the rescue: Da man sich bei der Arbeit mit Maven nicht auf die Verfügbarkeit der Standard-Maven-Repositories verlassen kann und darf (nach Murphy sind diese ja immer dann nicht verfügbar, wenn man sie dringend braucht), sind Maven-Proxies die Rettung. Um ein wenig Werbung zu machen: Das Tool Proximity (http://proximity.abstracthorizon.org) ist eine gute Wahl.