Dependency Bloat in Java

vorhergehende Artikel in: Java Komponenten
17.12.2022

Ich wurde durch einen Artikel neulich im Internet angestupst, Gedanken zu einem Thema aufzuschreiben, die schon länger in meiner hinteren klinken Gehirnwindung gären: Es geht dabei um Dependency Bloat vs. Nutzen vorhandener Infrastruktur.

Alles, was ich hier aufschreibe kann man in Verbindung zu meinen letzten Artikeln zum Thema Open Source und deren Einsatz in Unternehmen sehen - muss es aber nicht.

Es geht darum, dass in vielen Projekten unglaublich viele externe Dependencies eingesetzt werden, wo das eigentlich nicht notwendig ist. Die Verwaltung der Dependencies ist mit Werkzeugen wie Maven oder Ivy für Java oder npm für Javascript, nuget für .Net oder pip für Python in den letzten Jahren wesentlich vereinfacht worden - Allerdings führt das meiner Meinung nach auch dazu, dass viele Dependencies gedankenlos zu Projekten hinzugefügt werden, die man eigentlich nicht benötigt - würde man die potentiellen Kosten einer Eigenentwicklung gegen die Probleme beim Verschwinden der jeweiligen extenen Komponente gegeneinander abwägen. Hier kommt wieder die Verbindung zu meiner Abrechnung zu Tage: Unternehmen, die so arbeiten wirken eben nicht am OpenSource-Gedanken mit - sie nehmen einfach fertige Binaries und wenn die dann verschwinden ist das Heulen und Zähneklappern groß!

Aber das nur am Rande: Der Auslöser für diesen Aufschrieb war ein Artikel über ein JavaScript Projekt, das externe Dependencies losgeworden ist und hinterher feststellte, dass die Effekte an allen möglichen Stellen nur positiv waren: reduzierte Größe des Builds, reduzierte Buildzeit, bessere Performance,...

Und das brachte mich dazu konkret darüber nachzudenken, was eigentlich Spring(Boot) in Java macht und ob man vieles davon einfach auch mit Java Bordmitteln erreichen kann? Ich kam zu dem Schluss, dass das sehr gut geht: Es existieren in Java selbst zwei Mechanismen, durch die man auf einfache Art und Weise Dependency Injection und Inversion of Control erreichen kann, ohne irgendwelche Drittanbieterkomponenten in ein Projekt integrieren zu müssen, durch deren transiente Abhängigkeiten dann das halbe Internet zum Build dazugehört.

Diese beiden Komponenenten sind das Service Provider Interface und Bean Context.

Beide stellen letztlich Implementierungen von Service-Interfaces zur Laufzeit eines Systems zur Verfügung. Ich benutze beide in dWb+ als Basis der Anwendung und kann also auf langjährige Erfahrung mit ihnen zurückblicken.

SPI ist hervorragend für Dependency Injection geeignet, da durch das Hinzufügen oder Entfernen von Artefakten - zum Beispiel durch Modifikationen der Maven Build-Datei - einfach Implementierungen im Projekt getauscht werden können. Und ja - das geschieht jeweils vor dem Build. Aber seien wir doch ehrlich - wie viele Projekte, die Spring einsetzen ändern wirklich die XML-Dateien, die den Application-Context beschreiben nachdem das Projekt gebaut ist?

Der BeanContext bzw. die Services sind im Gegensatz dazu sehr viel dynamischer: Zur Laufzeit lassen sich hier Komponenten und Services hinzufügen und entfernen. Beans können das System nach konkreten Implementierungen von Services befragen und sich sogar mittels ServiceSelector eine auf ihre speziellen Bedürfnisse zugeschnittene Implementierungsvariante wünschen. Der gesamte Lifecycle eines Service kann überwacht werden und Beans könenn sich für Events einzelner Punkte des Lifecycle registrieren: Sie werden dann beispielsweise darüber informiert, dass ab einem bestimmten Zeitpunkt gewisse Services verfügbar wurdfen oder dass bisher verfügbare Services nicht mehr zur Verfügung stehen.

All das ohne OSGI, Spring oder sonstige Dependencies - lediglich mit Java Bordmitteln. Meiner Ansicht nach sollte man in neuen Projekten erst einmal danach Ausschau halten, was mit Bordmitteln funktioniert. Dadurch reduziert man die Abhängigkeit zu Drittanbietern drastisch und tut auch noch etwas für die Nachhaltigkeit - schließlich kostet die Übertragung des halben Internet beim Herunterladen externer Komponenten Energie und Ressourcen...

Artikel, die hierher verlinken

Tests mit Zeiten und Uhren in Java

11.01.2023

Ich habe vor nicht allzu langer Zeit hier bereits darauf hingewiesen, dass vieles, das aktuell in riesigen Frameworks vermeintlich erfunden wurde und wird bereits (seit langem) Teil von Java SE ist.

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.