Abhängigkeitsversionskonflikte vermeiden?

10

Jedes Java-Projekt, das mein JAR verwendet, hat mit ziemlicher Sicherheit eine zusätzliche Abhängigkeit von einem anderen JAR, das mein JAR auch als Abhängigkeit enthält.

Das Problem ist, dass andere JAR mehrere Versionen hat.

Wie kann ich Probleme vermeiden, die auftreten können, wenn sich die Version Ihres Projekts für das 2. Glas wahrscheinlich von der Version meines Glases für das 2. Glas unterscheidet?

Ich möchte nicht, dass meine Benutzer den zusätzlichen Aufwand haben, einen ausgefallenen Trick zum Laden von Klassen auszuführen, um mein Glas hinzuzufügen.

Sollte ich für jede mögliche Version dieser gemeinsamen Abhängigkeit nur eine Reihe verschiedener Versionen meines JAR erstellen? Und dann wählen Sie einfach die Version meines Glases aus, die dieselbe Version des zweiten Glases verwendet, die Sie gerade bereits haben?

Gibt es eine intelligentere Möglichkeit, damit umzugehen und es den Menschen zu erleichtern, mein Glas ohne Konflikte zu verwenden?

Dingredient
quelle

Antworten:

10

Es ist nicht dein Problem. Die Lösung liegt bei Ihrem Endbenutzer. Es gehört nur zum Gebiet der Verwendung von Abhängigkeiten von Drittanbietern, und ich musste Abhängigkeitskonflikte öfter lösen, als ich zähle. Sie können nicht erwarten, die spezifischen Abhängigkeitskonflikte jedes Projekts zu berücksichtigen.

Ihre Software sollte mit den neuesten Versionen Ihrer Abhängigkeiten ordnungsgemäß funktionieren. Sofern die Abhängigkeit ihre Benutzeroberfläche nicht bei jeder Version ändert, sollten Sie über eine Reihe von Kompatibilitätsbereichen verfügen (z. B. funktioniert Ihre Software für alle Versionen von dep in range [2.0.0, 3.0.0)). Solange Sie die Software warten, sollten Sie versuchen, sie mit der neuesten Version aller Ihrer Abhängigkeiten kompatibel zu halten.

Das heißt, hier sind einige Dinge, die ich als Entwickler nützlich finden würde, wenn ich Ihre Software mit meiner anderen Version Ihrer Abhängigkeit verwende.

  • Wenn die Integration zwischen Ihrem Projekt und einem anderen Projekt eng ist, ist es hilfreich, eine Kompatibilitätstabelle in Ihrer Dokumentation zu haben. Unabhängig davon sollten Sie alle bekannten Probleme mit bestimmten Versionen der Abhängigkeit in Ihrer Dokumentation erwähnen. Andernfalls müssen Entwickler durch Ausprobieren eine kompatible Version finden.
  • Abstrakt die Zusammenarbeit mit der Abhängigkeit über eine Schnittstelle und entwerfen Sie Ihre Software so, dass die Implementierung durch die Abhängigkeitsinjektion ersetzt werden kann. Dadurch kann ich als Endbenutzer meine eigene Integration in Version x der Bibliothek ersetzen, ohne Sie zu stören.
  • Verfügen Sie über einen öffentlichen Issue-Tracker, damit Ihre Benutzer Sie bitten können, bestimmte Versionen der allgemeinen Abhängigkeit zu unterstützen. Wenn Sie feststellen, dass viele Benutzer Unterstützung für eine inkompatible Version der Abhängigkeit wünschen, können Sie Versionen für beide veröffentlichen. In diesem Maven-Beispiel werden mehrere Plattformen angesprochen. Die Unterstützung für verschiedene Versionen einer Abhängigkeit sollte ähnlich sein.
Samuel
quelle
Hat Java so etwas wie die Assembly BindingRedirect App.config-Einstellung in .NET, in der Sie angeben können, dass Bibliotheken, die eine Abhängigkeit von Foo v3.0.2 anfordern, tatsächlich Foo v3.0.5 verwenden und so tun sollen, als wäre es v3.0.2? Ich habe Java seit über 11 Jahren nicht mehr gemacht, daher ist meine Erinnerung daran, wie es damit umgeht, einfach GEGANGEN.
John Zabroski