Was sind ungenutzte/nicht deklarierte Abhängigkeiten in Maven? Was tun mit ihnen?

Lesezeit: 4 Minuten

Benutzeravatar von b7kich
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?

Beispiel:

$ mvn dependency:analyze 
...
[WARNING] Used undeclared dependencies found:
[WARNING]    org.slf4j:slf4j-api:jar:1.5.0:provided
[WARNING]    commons-logging:commons-logging:jar:1.1.1:compile
[WARNING]    commons-dbutils:commons-dbutils:jar:1.1-osgi:provided
[WARNING]    org.codehaus.jackson:jackson-core-asl:jar:1.6.1:compile

...
[WARNING] Unused declared dependencies found:
[WARNING]    commons-cli:commons-cli:jar:1.0:compile
[WARNING]    org.mortbay.jetty:servlet-api:jar:2.5-20081211:test
[WARNING]    org.apache.httpcomponents:httpclient:jar:4.0-alpha4:compile
[WARNING]    commons-collections:commons-collections:jar:3.2:provided
[WARNING]    javax.mail:mail:jar:1.4:provided

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.

  • Verwandte Frage: stackoverflow.com/questions/19382814.

    – Sergej Wjatscheslawowitsch Brunov

    18. März 2016 um 9:15 Uhr


Benutzeravatar von Raghuram
Raghuram

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


Benutzeravatar von ahmednabil88
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.
Geben Sie hier die Bildbeschreibung ein

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.
Geben Sie hier die Bildbeschreibung ein

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!

Benutzeravatar von Mohamed Rafeek
Mohammed Rafeek

Dies kann leicht durch Hinzufügen behoben werden ignoredUnusedDeclaredDependencies in pom.xml

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <ignoredUnusedDeclaredDependencies>
                    <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
                </ignoredUnusedDeclaredDependencies>
            </configuration>
        </execution>
    </executions>
 </plugin>

1424850cookie-checkWas sind ungenutzte/nicht deklarierte Abhängigkeiten in Maven? Was tun mit ihnen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy