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
Antwort
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.)
[Proguard] (http://proguard.sourceforge.net) ist ein weiteres Beispiel, das das (und mehr) tun kann. – BalusC
@BalusC - und es gibt zweifellos andere würdige Beispiele. Aber leider adressieren sie * dieses * Problem nicht wirklich. –
Ich bezog mich auf den 1. Absatz :) Bevor du die praktischen Alternativen aufsetztest, denen ich aber voll zustimme (+1). – BalusC
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 ...
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.
- 1. Wie wird ein Block benötigt die minimal erforderliche Breite?
- 2. Loading Gläser nur, wenn es benötigt
- 3. Python: Für die Typprüfung werden Rundimporte benötigt
- 4. Minimal Thema für Eclipse
- 5. Feature erkennen, ob Benutzergeste benötigt wird
- 6. Was macht ein Feature und was für ein Szenario in Gurke und Gurke?
- 7. Was benötigt man, um ein Scala-Programm zu starten?
- 8. Bestimmung, die wurde überlasten
- 9. Was ist die "beste Vorgehensweise", um die Unterstützung für ein Feature zu entfernen?
- 10. Warum werden einige Gläser in der lib benötigt, und einige sind nicht in einem Krieg?
- 11. Was ist eine minimal große Bibliothek?
- 12. Classpath für Gläser in Gläsern
- 13. VB6 Dynamische Array-Bestimmung
- 14. Welche Baugruppen werden für MVC4 benötigt?
- 15. Welche Arten von Dokumenten werden für die Softwareentwicklung benötigt?
- 16. Was wird für PHP mcrypt_decrypt() benötigt?
- 17. Micropython oder minimal Python-Installation
- 18. Warum werden für metrische Implementierungen Leistungsmetrikbibliotheken benötigt?
- 19. Gleiche Feature-Wert für alle entsprechenden Feature
- 20. Minimal CommonJS Implementierung
- 21. Warum Ersatzschlüssel benötigt werden?
- 22. Wer ist verantwortlich für die Bestimmung der Größe des Stapels
- 23. Was ist die lodash-Bibliothek, wird sie für QuillJS benötigt?
- 24. Bestimmung Objekttyp
- 25. Was benötigt SMTP AUTH?
- 26. Was ist der minimale Satz von Sequenz- "Primitiven", die für irgendwelche Sequenzberechnungen benötigt werden?
- 27. Gemeinsame Feature-Zweig, die mit Master synchronisiert werden müssen
- 28. Minimal PHP Phar Stub
- 29. Was bedeutet "Generischer Typ" Feature <T> 'benötigt 1 Typ Argument (en) "in Typescript?
- 30. Tabellenzugriff vs Funktionsaufruf + bedingte Bestimmung: Was ist schneller?
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. –
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