Skip to main content

Java-Abhängigkeitsmanagement: Wie viele Codezeilen umfasst meine Anwendung?

Artikel von
Java engineering feature

12. August 2020

0 Min. Lesezeit

Vor 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.

Spring-Initializr-Seite mit ausgewählter Spring-Web-Abhängigkeit sowie Projektmetadaten und Optionen für die Java-Version.

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:

@RestController
public class Controller {

   @GetMapping("/hello")
   public String hello() {  return "hello"; }
}

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.

Weiterlesen

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSec: Sicherheit, die mit der KI-Entwicklung Schritt hält

KI-gestützte Entwicklung ist schneller als herkömmliche Sicherheitsabläufe. Snyks Agentic AppSec setzt Sicherheitsagenten ein, um Schwachstellen kontinuierlich zu finden, zu beheben und zu überprüfen – während Menschen die Maßstäbe festlegen.

blog feature ai violet
Blog

VulnBump: Können KI-Agenten anfällige Abhängigkeiten beheben, ohne den Build zu beschädigen?

VulnBump testet KI-Agenten anhand von 307 realen Upgrades von Abhängigkeiten. Eine Behebung zählt nur, wenn die Sicherheitslücke geschlossen ist und Build und Tests weiterhin erfolgreich sind.

Blog

Frontier-Modelle fanden die Schwachstellen. Nur der Angreifer fand die Angriffsketten.

Die statische Analyse fand die Schwachstellen, doch erst Live-Angriffstests bewiesen, wie sie sich zu Angriffen verketten lassen. Ein Vergleich von Evo COS, Claude Security und Claude Code Security.