2013-07-08 12 views
9

Ich arbeite an einem Java-Projekt in Eclipse, mit Maven zum Erstellen und Verwalten von Abhängigkeiten. Das Projekt ist auf 5 Eclipse-Projekte verteilt, von denen eines der Eltern POM ist. Ich arbeite an einer Serverimplementierung, die auf einem viel komplizierteren Server basiert, den ein anderes Team implementiert hat. Also habe ich meine Arbeit von ihren bereits existierenden Code- und POM-Dateien abgeleitet und habe jetzt viele unnötige Abhängigkeiten in den POMs in diesen Eclipse-Projekten.Wie (sichere) entfernen Sie unnötige Maven-Abhängigkeiten in Eclipse?

Relativ gesehen, ich bin ein Maven Anfänger, aber ich bin mit diesem Befehl:

mvn dependency:analyze 

Wenn ich diesen Befehl mit dem Eclipse-Maven Plugin laufen, werde ich eine lange Liste von „nicht verwendet bekommen erklärt Abhängigkeiten, "aber wenn ich versuche, einige von ihnen zu entfernen, wird mein Programm manchmal auf mysteriöse Weise brechen.

Gibt es eine allgemein akzeptierte, bewährte Vorgehensweise, um mit diesem Problem umzugehen? Oder bin ich damit einverstanden, diese (wahrscheinlich) unbenutzten Abhängigkeiten eins nach dem anderen zu entfernen, um sicherzustellen, dass nichts nach dem Entfernen der einzelnen aufgehoben wird?

+0

hebt Eclipse Codefehler aufgrund fehlender Abhängigkeiten schnell hervor, nachdem Sie sie entfernt haben? – vikingsteve

+0

Nein, nach dem Entfernen dieser Abhängigkeiten treten keine Kompilierzeitfehler auf. Das ist das Rätselhafte an dieser Situation. –

+0

Sie können Laufzeitabhängigkeiten haben, die keine Kompilierungsfehler implizieren. Zum Beispiel Logging-Implementierung, die zur Laufzeit mit einer Konfigurationsdatei verwendet werden soll. – YMomb

Antwort

1

Sie könnten versuchen, Ihren Code mit der aktivierten Java Option -verbose:class auszuführen. Dies erzeugt eine Ausgabe, die zeigt, wo (aus welcher JAR-Datei) jede Klasse geladen wird. (Anmerkung: auf Sun JREs dies wird geschrieben Standard aus, ich glaube, auf IBM JREs es Standardfehler geschrieben wird.) Hier ist ein Beispiel der Ausgabe:

[Loaded junit.framework.AssertionFailedError from file:/D:/Documents%20and%20Settings/mike/.m2/repository/junit/junit/3.8.2/junit-3.8.2.jar] 
[Loaded junit.framework.ComparisonFailure from file:/D:/Documents%20and%20Settings/mike/.m2/repository/junit/junit/3.8.2/junit-3.8.2.jar] 
[Loaded org.jmock.core.SelfDescribing from file:/D:/Documents%20and%20Settings/mike/.m2/repository/jmock/jmock/1.2.0/jmock-1.2.0.jar] 
[Loaded org.apache.log4j.spi.Configurator from file:/D:/Documents%20and%20Settings/mike/.m2/repository/log4j/log4j/1.2.9/log4j-1.2.9.jar] 
[Loaded org.apache.log4j.xml.DOMConfigurator from file:/D:/Documents%20and%20Settings/mike/.m2/repository/log4j/log4j/1.2.9/log4j-1.2.9.jar] 

Solange Sie die meisten Ihrer Programmlogik laufen (Damit die erforderlichen Klassen geladen werden), können Sie sicher davon ausgehen, dass alle Jars, die nicht in der Ausgabe von verbose: class erwähnt sind, als maven-Abhängigkeit entfernt werden können.

Sie können auch eine Suche & ersetzen in der verbose: class-Ausgabe, um es in csv zum Beispiel, dann bringt es in ein Tabellenkalkulationsprogramm zum Sortieren/Gruppieren von den Jar-Dateien.

Noch ein bisschen manuelle Anstrengung, aber zumindest würde es dir irgendwo einen Anfang geben!

+0

Klingt wie die am wenigsten schmerzhafte Lösung. Ich werde es versuchen, danke! –

0

Ich weiß nicht, dass es allgemein akzeptierte Best Practices gibt, da alles, von Introspektion bis zu Services, zur Laufzeit unterbrochen werden kann. Komponententests könnten Ihnen helfen, aber wenn Sie keine gute Abdeckung haben, könnten sie Ihnen ein falsches Gefühl der Sicherheit geben. Sie müssen immer noch mit Funktionstests (hoffentlich automatisch) überprüfen, nachdem Sie jedes Paket entfernen.

Verwandte Themen