Ist der plattformgesteuerte Versionierungsmechanismus das am dringendsten benötigte Feature von Java?

8

Als Entwickler bin ich oft an neuen Sprachfunktionen interessiert, die Ihnen das Leben erleichtern können. Zum Beispiel, Java 5 brachte Generika und Anmerkungen zur Sprache, Funktionen, die Ihre Produktivität definitiv steigern können.

Wenn ich jedoch auf fast ein Jahrzehnt zurückblicke, in dem ich an der Java-Plattform arbeite, stelle ich fest, dass Probleme im Zusammenhang mit der Versionsverwaltung der größte Schuldige an unproduktiven und unnötigen Anstrengungen sind. Stundenlanges Suchen nach der richtigen Version des Jars, Versuch, einen Versionskonflikt auszugleichen, abhängige Bibliotheken zu aktualisieren usw. Als ich anfing, in Java zu arbeiten, waren die Dinge nicht so schwierig, Sie hatten ein paar Bibliotheken von Drittanbietern und das war's . Heute kann Ihre typische Web-App leicht verwendet werden: Spring Framework, Hibernate, Struts, Sie nennen es. Alle diese enthalten eine Anzahl von abhängigen 3rd-Party-Bibliotheken. Heute werden meine Ohrarchive typischerweise 40 oder mehr 3rd-Party-Bibliotheken enthalten. Ein echtes Glas Hölle!

Bei Annotationen muss ich zum Beispiel keine Konfigurationsdateien für Hibernate verwalten. Ein nettes Feature, aber ich habe nicht viele Probleme gesehen, die sich aus der Tatsache ergeben, dass ich meine Deskriptoren in separaten Dateien aufbewahre. Bei Generika bleibt mir das Schreiben von Cast-Statements erspart, aber in meinem gesamten Programmier-Carrier kann ich mich nicht an einen einzelnen Fehler erinnern, der durch den Einsatz eines typsicheren Containers hätte verhindert werden können. Wäre die Lösung von Versionierungsproblemen nicht viel wertvoller?

All diese Probleme haben zu einer Anzahl von Werkzeugen wie Maven , ivy , Ein Glas , Jar Jar Links (kein Scherz!), auch richtig benannt Jar Hell usw. Auch wenn Sie einige dieser Tools verwenden, sind Sie bei weitem nicht immun gegen das Problem. Ich benutze Maven 2 und es war eine große Hilfe. Dennoch ist es eine Welt für sich. Anfänger Programmierer kann eine Weile dauern, um es zu lernen. Es ist auch ein Problem, Ihre alten Projekte in die Maven-Struktur zu verschieben.

Es scheint so, als hätten sie in .Net die Lektion mit der Hölle gelernt und das Management von .Net-Assemblies ist viel einfacher.

Es scheint Pläne zu geben, dieses Problem für Java-Plattformen und Alternativen wie OSGI zu lösen. Ich denke, dass ein einfacher und plattformgesteuerter Versionierungsmechanismus dringend benötigt wird.

    
Dan 20.02.2009, 23:12
quelle

5 Antworten

4

Werfen Sie einen Blick auf OSGi - es befasst sich sehr gut mit Versionierung und Verwaltung von Bundles (Jars).

ALSO: Eclipse (das auf OSGi aufbaut) verfügt über einige relativ neue API-Tools, mit denen Sie Ihre API mit einer früheren Baseline vergleichen und festlegen können, wie Sie die nächste Versionsnummer Ihrer Bundles angemessen ausdrücken können.

Das allgemeine Eclipse-Versionierungsschema:

%Vor%

wo

v: High-Level-Version - Änderungen hier sind in der Regel brechen Änderungen in der API

m: große Änderungen - neue Funktionalität, neue API

n: kleine Änderungen - gleiche API, Änderungen hinter den Kulissen

q: Qualifier - nützlich zum Markieren von Builds, Alpha / Beta usw.

OSGi gibt Versionsabhängigkeiten mithilfe von Bereichen an. Zum Beispiel

%Vor%

in Ihrer MANIFEST.MF gibt an, dass das Bundle Version 1.2.0 oder höher des Bundles com.javadude.foo, bis einschließlich (jedoch nicht einschließlich) Version 2.0.0, erfordert.

Sie können stattdessen auch Abhängigkeiten auf Paketebene angeben.

    
Scott Stanchfield 24.02.2009, 17:28
quelle
5

Ich benutze Java schon seit über einem Jahrzehnt, aber ich muss sagen, dass ich nicht viele Probleme mit gefunden habe (sogar mit allen von Ihnen erwähnten Drittanbieter-Tools)! Ich fand Maven als ein schreckliches Werkzeug, also baue alles mit ant .

In unserem Unternehmen haben wir eine maßgeschneiderte Abhängigkeitslösung ant auf der Grundlage einer einfachen (kleinen) Abhängigkeitsdatei für jedes Projekt, zusammen mit der Definition jedes Projekts als app oder lib (nur Sie sollten jemals abhängig von lib ; niemals app ). Es funktioniert gut.

Wir haben auch ant tasks, um unsere Eclipse .classpath und IDEA .iml Dateien zu modifizieren, um Abhängigkeitsgraphen für unsere IDEs zu generieren.

    
oxbow_lakes 21.02.2009 11:36
quelle
0

Der Vorteil von .NET gegenüber Java besteht darin, dass die Bibliotheken enger an das Betriebssystem gebunden sind. Die Tatsache, dass die Framework-Bibliotheken, wenn sie installiert sind, sich leicht im GAC befinden, vereinfacht die Dinge, aber Sie sind auch ziemlich auf Windows beschränkt. Ein besserer Vergleich wäre Mono, aber ich habe dort keine Erfahrung.

Das Konfigurationsmanagement, zumindest für mich, war schon immer der große Schmerz der Softwareentwicklung. Je mehr Sie versuchen, den vorhandenen Code zu nutzen, desto schlimmer wird es. Das Problem selbst ist nicht einzigartig für Java, aber die Verbreitung von Versionen, die Zeit, die die Plattform zur Verfügung steht und die Anzahl der unterstützten Plattformen scheinen es noch schlimmer zu machen. Ich habe gerade überprüft und ich habe jetzt 3 Versionen der JRE auf meiner Box - und ich bin nicht einmal ein aktiver Java-Entwickler.

Was Ihre Frage anbelangt, bin ich mir nicht sicher, ob dies das dringendste Feature ist, das Sie brauchen. Ich persönlich würde gerne eine bessere Unterstützung für Webdienste sehen, insbesondere für solche, die Authentifizierungsheader benötigen. Als ich das letzte Mal versucht habe, Java mit einem meiner .NET-Webdienste zu interagieren, riss ich mir fast die Haare aus. Nachdem ich LINQ mit C # / .Net verwendet habe, kann ich auch sagen, dass dies eine ziemlich coole Ergänzung zu Java wäre, mit wohl mehr Produktivitätsgewinnen.

    
tvanfosson 20.02.2009 23:29
quelle
0

.NET unterstützt Side-by-Side-Assemblys, sodass Sie mehrere Versionen der gleichen App erstellen können. Das GAC ist wie freigegebene DLLs, aber Sie können immer noch mehrere Versionen derselben Assembly im GAC registrieren und eine andere Assembly kann eine bestimmte oder eine größere Version anfordern, wenn ich mich gut erinnere. In JavaEE gibt es mehrere Class-Loader-Level und Sie können einige Tricks anwenden, die eine ähnliche Versionierung simulieren.

    
George Birbilis 21.02.2009 03:32
quelle
0

Ich stieß auf dieses Problem an einer Site, an der ich gearbeitet habe: ein Tool, um die JAR-Dateien auf einem Webserver durchzugehen und alle verschachtelten Kopien von JAR-Dateien zu finden - und verschiedene Dateien mit den gleichen Namen (zB: Versionen von log4j.jar). Es war ein hässliches Durcheinander, einschließlich eines WAR, in dem das WebLogic-Jar drin war .

Nicht sicher, was die Lösung ist.

Das ist: java hat Zeug, um dies zu verwalten - gestempelte JAR-Dateien mit Paketversionen. Und vor allem: Webstart. Vielleicht braucht man eine Art Classloader, der ein Webstart-ähnliches Ding macht.

Wie geht es: Im JAR-Manifest geben Sie Bibliotheksabhängigkeiten unter Verwendung bekannter Namen und Versionen an. Der Klassenlader - vom Container oder der Runtime bereitgestellt - wäre dafür verantwortlich, die gewünschten Versionen zu erhalten.

Es gibt viele Systeme (zB: Maven selbst), um bekannte Orte zu verwalten, von denen Bibliotheken heruntergeladen werden können, sowie fink und whatnot.

    
paulmurray 21.02.2009 12:38
quelle

Tags und Links