Java-Abhängigkeitsmanagement: Wie viele Codezeilen umfasst meine Anwendung?
12. August 2020
0 Min. LesezeitVor einigen Wochen hatte ich die Gelegenheit, auf der niederländischen Java-Konferenz JSpring einen Vortrag zu halten. Dabei ging es um das Abhängigkeitsmanagement in Java.
Während des Vortrags erstellte ich eine einfache Spring-Boot-Anwendung und ermittelte, wie viele Codezeilen meine Java-Abhängigkeiten einbrachten und wie viele ich selbst geschrieben hatte. Damit wollte ich zeigen, dass Abhängigkeiten einen großen Teil Ihrer Anwendung ausmachen und ebenfalls Aufmerksamkeit benötigen. Nach dem Vortrag veröffentlichte ich den folgenden Tweet, der viel Aufmerksamkeit erhielt und mich dazu inspirierte, diesen Blogbeitrag zu schreiben:
Die Anzahl der Codezeilen meiner Java-Abhängigkeiten ermitteln
Schritt 1: Eine Spring-Boot-Anwendung generieren
Zunächst erstellte ich mithilfe des Spring Boot Initialzr eine Spring-Boot-Anwendung, bei der web die einzige Abhängigkeit war.

Das bedeutet im Grunde, dass mein Projekt spring-boot-starter-web als einzige direkte Abhängigkeit enthält.
Schritt 2: Einen REST-Controller erstellen
Als Nächstes schrieb ich den einfachsten REST-Endpunkt, den man sich vorstellen kann – mit gerade einmal vier Zeilen:
Schritt 3: Das deploybare JAR erstellen
Die aus diesem Java-Projekt erstellte JAR-Datei ist ein Fat-JAR, das alle JARs enthält, von denen das Projekt abhängt. Der Grund: Spring Boot bündelt den Anwendungsserver im Grunde mit der Anwendung selbst.
Schritt 4: Das JAR analysieren
Als Nächstes erstellte ich eine einfache Anwendung, die das erstellte Spring-Boot-JAR verarbeitet. Sie entpackt die JAR-Datei und alle darin enthaltenen Abhängigkeiten. Anschließend werden alle Klassendateien in den JARs dekompiliert und die Codezeilen gezählt.
Schritt 5: Die Ergebnisse erfassen
Geschriebene Codezeilen: 4
JARs: 33
Klassendateien: 9917
Codezeilen: 518772
Einige Anmerkungen zu den Zahlen
Die oben gezeigten Zahlen sind alles andere als exakt. Leerzeilen und Zeilen mit nur einer Klammer wurden ausgelassen und sind daher nicht in der Endsumme enthalten.
Man kann darüber diskutieren, ob wir diese Zeilen genauer analysieren und noch mehr davon auslassen sollten, um genauere Zahlen zu erhalten. Außerdem liefern verschiedene Decompiler unterschiedliche Ergebnisse.
Ich würde das eher als Pseudowissenschaft bezeichnen. Die Zahlen sind zwar nicht exakt, zeigen aber, welche große Rolle Abhängigkeiten in unseren Anwendungen spielen. Genau das wollte ich verdeutlichen.
Kümmern Sie sich um Ihre Java-Abhängigkeiten
Gut, die Zahlen sind hoch – aber was sagt uns dieses Beispiel eigentlich? Erstens ist Spring Boot für eine Hello-World-Anwendung überdimensioniert. Zweitens ist Spring Boot ein Anwendungsserver, daher sind diese hohen Zahlen zu erwarten, oder?
All diese Anmerkungen stimmen. Ich gebe zu: Das war der nutzloseste REST-Endpunkt, den man sich vorstellen kann. Das unterstreicht jedoch, dass Abhängigkeiten einen großen Anteil der Binärdatei ausmachen, die wir in die Produktion bringen. Da Spring Boot ein Framework ist, das von unzähligen Java-Entwicklern verwendet wird, habe ich es bewusst für dieses Beispiel ausgewählt.
Denken Sie einmal darüber nach: In diesem Beispiel machen die Codezeilen, die ich geschrieben habe, deutlich weniger als 1 % aller Codezeilen aus, die wir in die Produktion bringen. Als Team sind wir dennoch für den gesamten Code verantwortlich. Wenn mit der Anwendung etwas schiefläuft, muss das Entwicklungsteam das Problem beheben. Maßnahmen wie Code-Reviews, Pair Programming und statische Codeanalyse helfen zweifellos dabei, eine bessere Codebasis zu schaffen. Doch was ist mit den 99 % des Codes, den wir verwenden und auf den wir uns verlassen?
Es ist entscheidend, sich um Ihre Abhängigkeiten zu kümmern und sie rechtzeitig zu aktualisieren. Der Import eines einzelnen Pakets bringt zahlreiche Abhängigkeiten und potenzielle Angriffsvektoren mit sich. Jedes Entwicklungsteam sollte eine Strategie für das Java-Abhängigkeitsmanagement festlegen, die regelt, wie Abhängigkeiten ausgewählt, aktualisiert und entfernt werden. Aus Sicherheitssicht sollten Sie zumindest gewarnt werden, wenn eine Ihrer direkten oder transitiven Abhängigkeiten eine Schwachstelle aufweist.
Wenn Sie Ihre Anwendung mit Snyk scannen, um Schwachstellen in Ihren Open-Source-Abhängigkeiten zu erkennen, kann Sie das dabei unterstützen. Snyk lässt sich in jedem Schritt des Softwareentwicklungslebenszyklus (SDLC) einsetzen und flexibel anpassen – ideal für die Automatisierung. Snyk erkennt Schwachstellen nicht nur, sondern hilft Ihnen auch, sie so früh wie möglich aufzuspüren.
Fazit
Es reicht nicht immer aus, sich gut um unseren Code zu kümmern – wir sollten auch unsere Abhängigkeiten im Blick behalten, denn sie spielen in unseren Anwendungen eine große Rolle.
Wenn Sie Ihre Abhängigkeiten mit Tools wie Snyk scannen, bleiben Schwachstellen darin nicht unbemerkt. Darüber hinaus ist eine solide Strategie für das Java-Abhängigkeitsmanagement entscheidend, damit Ihre Anwendung wartbar, skalierbar, vorhersehbar und vor allem sicher bleibt!
Starten Sie mit Capture the Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.



