Was sind ungenutzte/nicht deklarierte Abhängigkeiten in Maven? Was tun mit ihnen?
Lesezeit: 4 Minuten
b7kich
Maven dependency:analyze beschwert sich über die Abhängigkeiten in meinem Projekt. Wie wird bestimmt, welche ungenutzt und welche nicht deklariert sind? Was soll ich dagegen tun?
Hinweis: Viele dieser Abhängigkeiten werden in meinem Runtime-Container verwendet und ich habe sie als bereitgestellt deklariert, um zu vermeiden, dass dieselbe Bibliothek zweimal mit unterschiedlichen Versionen im Klassenpfad vorhanden ist.
Nicht sicher, wie Maven dies bestimmt. Es ist nicht erforderlich, alle von diesem gemeldeten Punkte zu adressieren, aber diese Informationen können entsprechend verwendet werden.
Nicht deklarierte Abhängigkeiten verwendet sind diejenigen, die erforderlich sind, aber in Ihrem Projekt nicht explizit als Abhängigkeiten deklariert wurden. Sie sind jedoch dank der transitiven Abhängigkeit von anderen Abhängigkeiten in Ihrem Projekt verfügbar. Es ist eine gute Idee, diese Abhängigkeiten explizit zu deklarieren. Auf diese Weise können Sie auch die Version dieser Abhängigkeiten steuern (möglicherweise passend zu der von Ihrer Laufzeitumgebung bereitgestellten Version).
Wie für nicht verwendete deklarierte Abhängigkeiten, ist es eine gute Idee, sie zu entfernen. Warum unnötige Abhängigkeiten zu Ihrem Projekt hinzufügen? Aber dann kann die Transitivität diese trotzdem einbringen, vielleicht in Konflikt mit Ihren Laufzeitversionen. In diesem Fall müssen Sie sie angeben – im Wesentlichen, um die zu kontrollieren version.
Übrigens, mvn dependency:tree gibt die Abhängigkeitsbaum des Projekts, was Ihnen einen besseren Überblick darüber gibt, wie jede Abhängigkeit in Ihr Projekt passt.
Auch Abhängigkeiten können ungenutzt erscheinen, sind es aber tatsächlich. Einige Beispiele hierfür sind jdbc-Treiber oder Konfigurations-JAR-Dateien, die Anwendungskontexte benötigen.
– AHungerArtist
19. April 2012 um 22:37 Uhr
Abhängigkeiten mit runtime oder provided Bereich wird als “Unbenutzt deklariert” gekennzeichnet, es sei denn, Sie verwenden die ignoreNonCompile Flag bei der Analyse von Abhängigkeiten.
– Duncan Jones
2. April 2013 um 10:04 Uhr
Warum ist es sinnvoll, transitive Abhängigkeiten explizit zu deklarieren? Ist die Automatisierung transitiver Abhängigkeiten nicht Teil dessen, wofür Maven gut ist?
– schlank
16. März 2015 um 16:40 Uhr
Raghuram bezog sich auf verwendete nicht deklarierte Abhängigkeiten. Das heißt, Ihr Projekt A verwendet Bibliothek B, die von Bibliothek C abhängt. Wenn Sie auch C direkt verwenden, müssen Sie es nicht deklarieren – Maven zieht es automatisch durch die transitive Abhängigkeit ein. Aber ohne die Deklaration der Abhängigkeit haben Sie keine Kontrolle über die Version. ZB wenn B beschließt, auf die nächste Version von C zu aktualisieren, kann Ihr Projekt A kaputt gehen, es sei denn, das Update ist abwärtskompatibel
– b7kich
12. April 2016 um 22:19 Uhr
Die Antwort auf:
“Wie wird bestimmt, welche nicht verwendet und welche nicht deklariert sind?”.
Maven verwendet Objekt WebASM Framework, das Ihren rohen Bytecode analysiert. Es durchläuft alle Ihre Klassen und erstellt dann eine Liste aller Klassen, auf die diese verweisen. Das ist das Wie.
Was zu tun ist, würde ich nicht empfehlen, die “nicht verwendeten, deklarierten Abhängigkeiten” zu entfernen, es sei denn, Sie sind sich absolut sicher, dass sie tatsächlich nicht verwendet werden.
Vielen Dank! Ich habe eine falsche Warnung “nicht verwendete deklarierte Abhängigkeit” für eine Bibliothek erhalten, obwohl ich einen Typ daraus importiert und verwendet habe, sodass ich nicht herausfinden konnte, warum. Aber wenn Maven den Bytecode und nicht den Quellcode untersucht, erklärt das: Der Typ, den ich verwendet habe, war ein Annotationstyp mit Nur-Quellen-Aufbewahrung, was bedeutet, dass die Verwendung der Annotation nie in den Bytecode gelangt ist, weshalb Maven dies konnte sehe es nicht.
– Aasmund Eldhuset
21. April um 14:06 Uhr
ahmednabil88
Gebraucht undeklarierte Abhängigkeiten
Sie sind einfach die transitiven Abhängigkeiten, die du benutzt sie aber OHNE sie zu deklarieren explizit in Ihrer POM-Datei.
Im unteren Diagramm das orangefarbene.
Hinweis:
Es ist eine gute Idee erklären Sie in Ihrer POM-Datei so, dass sie lose mit Ihren Abhängigkeiten der ersten Ebene gekoppelt sind. Wenn sie also in Zukunft planen, ihre Implementierung zu ändern und diese transitiven Abhängigkeiten nicht mehr zu verwenden, ist Ihre Anwendung sicher!
Unverwendete deklarierte Abhängigkeiten
Einfach, sie sind die Abhängigkeiten, die du deklarierst sie in Ihrer POM-Datei OHNE sie zu benutzen in Ihrem Anwendungscode.
Im unteren Diagramm das rot gefärbte.
Hinweis:
Es ist eine gute Idee Löschen sie aus Ihrer POM-Datei, da sie nicht verwendet werden, und um die endgültige Größe des Anwendungsartefakts zu speichern, auch um zu vermeiden, dass Entwickler versehentlich falsche Klassen verwenden!
Mohammed Rafeek
Dies kann leicht durch Hinzufügen behoben werden ignoredUnusedDeclaredDependencies in pom.xml
Verwandte Frage: stackoverflow.com/questions/19382814.
– Sergej Wjatscheslawowitsch Brunov
18. März 2016 um 9:15 Uhr