2010-05-08 6 views
5

Wie bestimmen Sie, welche Gläser für solche und solche Funktion eines Rahmens erforderlich sind? Zum Beispiel, welche JAR-Dateien werden von allen für Spring verfügbaren benötigt, um nur die Abhängigkeitsinjektion zu unterstützen?Die Bestimmung, was minimal Gläser für ein Feature benötigt werden

+3

Test, Test, Test. Aber normalerweise, wenn Framework sagt, dass es alle Gläser braucht, stellen Sie besser alle Gläser zur Verfügung, sonst sind Sie allein. –

+1

Ein Beispiel ist Frühling. Fast alle Abhängigkeiten von Drittanbietern sind im Maven POM als optional gekennzeichnet. Ich stimme zu, dass Testen das "Catch-All" dafür ist, aber es ist eine gute Frage - ich habe mir oft gewünscht, dass ich zur Laufzeit weiß, welche Bibliotheken tatsächlich verwendet werden. Ich habe einen Java Ahead-of-Time Native Compiler verwendet - dies erfasst alle verwendeten Klassen und die Jars, aus denen sie stammen. Sie könnten etwas ähnliches mit einem benutzerdefinierten Klassenlader emulieren, der die geladenen Klassen verfolgt und Class.getResource() verwendet, um den Speicherort zu ermitteln. – mdma

Antwort

4

Es gibt Tools, die minimale JARs erstellen, indem Sie herausfinden, welche Klassen tatsächlich in einer Anwendung verwendet werden, indem Sie den Code statisch analysieren und dann ein neues JAR erstellen diese Klassen. (. Ich erinnere mich mit ZELIX Classmaster, dies zu tun, aber es gibt viele Alternativen)

Das Problem mit der Verwendung dieser Werkzeuge für einen DI Rahmen wie Spring sind:

  • Die bestehenden nur statische Abhängigkeiten verfolgen. Wenn Sie Klassen dynamisch laden, müssen Sie dem Analyzer jeweils etwas mitteilen. DI-Frameworks im Allgemeinen und Spring im Besonderen sind voll von dynamischem Laden, einschließlich dynamischem Laden, das für Anwendungscode undurchsichtig ist.

  • Die vorhandenen Tools arbeiten, indem sie eine neue Ausgabe JAR erstellen, von Ihnen nicht zu sagen, welche der Eingangs JARs werden nicht verwendet. Während das Neupacken der JARs in Ordnung ist, wenn Sie eine komprimierte Anwendung aus einer Codebasis mit geschlossener Quelle erstellen, ist dies im Allgemeinen unerwünscht und bei einigen Open-Source-Lizenzen möglicherweise problematisch. Sicherlich wollen Sie das nicht mit Spring machen.

In der Theorie könnte jemand ein Werkzeug schreiben, um zu helfen. In der Praxis müsste das Tool zum Beispiel wissen, wie dynamische Klassenabhängigkeiten aus Spring-Konfigurationen in Annotationen, XML und aus Bean-Deskriptoren extrahiert werden, die zur Laufzeit aus einer Konfiguration höherer Ordnung erstellt werden (z. B. SpringSecurity). Das ist eine große Frage. Und selbst dann besteht das Problem, dass eine "kleine" Änderung an den auf der Installationsplattform vorgenommenen Verkabelungen fehlschlagen kann, da JARs vom JAR-Bereinigungsprozess nicht benötigt wurden.

Aus meiner Sicht ist, desto mehr praktischen Alternativen sind:

  • Wenn Sie Maven/Ivy verwenden Ihre Abhängigkeiten zu verwalten, zu den Abhängigkeitsgraphen sehen, Streifen Abhängigkeiten aus, die nicht mehr zu sein scheint benötigt ... und testen, testen, testen.
  • manuell JARs Streifen aus, der ungenutzt erscheinen ... und Test, Test, Test.
  • Mach dir keine Sorgen darüber. Eine moderate Menge an unbenutztem JAR-Gruft könnte die Bereitstellungszeiten für die Bereitstellung und die Webanwendung um ein oder drei Sekunden verlängern, was aber im Allgemeinen nicht von Bedeutung ist. (Aber wenn es so ist ... siehe oben.)
+1

[Proguard] (http://proguard.sourceforge.net) ist ein weiteres Beispiel, das das (und mehr) tun kann. – BalusC

+0

@BalusC - und es gibt zweifellos andere würdige Beispiele. Aber leider adressieren sie * dieses * Problem nicht wirklich. –

+0

Ich bezog mich auf den 1. Absatz :) Bevor du die praktischen Alternativen aufsetztest, denen ich aber voll zustimme (+1). – BalusC

1

Aus diesem Grund einige ältere Java-Projekte 600 Gläser und eine 200 MB-Datei Krieg am Ende mit, für eine 10.000 Zeilenanwendung. Eine Art von Schmerzen, wenn Sie es nicht sorgfältig verwalten ...

0

Sie sollten wirklich den Framework-Anbieter fragen oder die Dokumentation lesen. Statisch zu analysieren, welche Gläser benötigt werden, kann in manchen Fällen nicht ausreichen (dynamisches Laden) und manchmal können Sie zu viele Gläser haben.

Ich habe einmal einige ftp Helfer Zeug zu einer Art „Nützlichkeit“ Bibliothek. Es hing von einigen Apache FTP-Jar. Wenn Sie die FTP-Funktionen in der Bibliothek nie verwendet haben, würden Sie das ftp jar nicht benötigen, aber die statische Analyse des Codes könnte bedeuten, dass Sie es brauchen. Das sollten Sie dokumentieren.

Verwandte Themen