Wir migrieren derzeit von Java 8 auf Java 11. Das Upgrade unserer Dienste war jedoch weniger schmerzhaft als erwartet. Wir mussten im Grunde nur die Versionsnummer in unserer build.gradle
Datei ändern und die Dienste waren zufriedenstellend. Wir haben Bibliotheken sowie (Mikro-) Dienste aktualisiert, die diese Bibliotheken verwenden. Bis jetzt keine Probleme.
Gibt es eine Notwendigkeit , um tatsächlich zu Modulen wechseln? Dies würde meiner Meinung nach unnötige Kosten verursachen. Jeder Vorschlag oder weiteres Lesematerial ist willkommen.
Gibt es Konsequenzen, wenn Java 9+ Code ohne Einführung von Modulen verwendet wird? Kann es zB mit anderem Code inkompatibel werden?
java
java-11
java-platform-module-system
Younes EO
quelle
quelle
Antworten:
Nein.
Es ist nicht erforderlich, zu Modulen zu wechseln.
Es war nie notwendig, auf Module umzusteigen.
Java 9 und spätere Versionen unterstützen traditionelle JAR-Dateien auf dem traditionellen Klassenpfad über das Konzept des unbenannten Moduls und werden dies wahrscheinlich bis zum Hitzetod des Universums tun.
Ob Sie mit der Verwendung von Modulen beginnen, liegt ganz bei Ihnen.
Wenn Sie ein großes Legacy-Projekt pflegen, das sich nicht sehr ändert, ist es wahrscheinlich nicht die Mühe wert.
Wenn Sie an einem großen Projekt arbeiten, dessen Wartung im Laufe der Jahre schwierig geworden ist, kann die Klarheit und Disziplin, die die Modularisierung mit sich bringt, von Vorteil sein, aber es kann auch viel Arbeit bedeuten. Überlegen Sie also sorgfältig, bevor Sie beginnen.
Wenn Sie ein neues Projekt starten, empfehle ich dringend, mit Modulen zu beginnen, wenn Sie können. Viele beliebte Bibliotheken wurden inzwischen zu Modulen aufgerüstet , sodass die Wahrscheinlichkeit groß ist, dass alle benötigten Abhängigkeiten bereits in modularer Form verfügbar sind.
Wenn Sie eine Bibliothek verwalten, empfehle ich dringend, sie zu einem Modul zu aktualisieren, wenn Sie dies noch nicht getan haben und wenn alle Abhängigkeiten Ihrer Bibliothek konvertiert wurden.
All dies bedeutet nicht, dass Sie beim Überholen von Java 8 nicht auf einige Stolpersteine stoßen werden. Diejenigen, auf die Sie stoßen, haben jedoch wahrscheinlich nichts mit Modulen an sich zu tun . Die häufigsten Migrationsprobleme , dass wir davon gehört haben , seit wir veröffentlicht Java 9 im Jahr 2017 zu tun haben mit Änderungen an der Syntax der Versionszeichenfolge und zum Entfernen oder Kapselung von internen APIs ( zB ,
sun.misc.Base64Decoder
) , für die Öffentlichkeit, unterstützt Ersatz haben seit Jahren verfügbar.quelle
Ich kann Ihnen nur meine Organisationsmeinung zu diesem Thema mitteilen. Wir sind dabei , für jedes einzelne Projekt, an dem wir arbeiten, auf Module umzusteigen. Was wir bauen, sind im Grunde genommen Mikrodienste + einige Client-Bibliotheken. Für Mikrodienste hat der Übergang zu
modules
irgendwie eine niedrigere Priorität: Der Code dort ist bereits irgendwie im Docker-Container isoliert, so dass das "Hinzufügen" von Modulen dort (für uns) nicht sehr wichtig erscheint. Diese Arbeit wird langsam aufgenommen, hat aber eine niedrige Priorität.Auf der anderen Seite ist Client-Bibliotheken eine ganz andere Geschichte. Ich kann dir das Chaos nicht sagen, das wir manchmal haben. Ich werde einen Punkt erklären, den ich vorher gehasst habe
jigsaw
. Sie stellen Clients eine Schnittstelle zur Verfügung, die jeder verwenden kann. Automatischinterface
ist daspublic
- der Welt ausgesetzt. Normalerweise habe ich dann einigepackage-private
Klassen, die nicht den Clients ausgesetzt sind, die diese Schnittstelle verwenden. Ich möchte nicht, dass Kunden das verwenden, es ist intern. Hört sich gut an? Falsch.Das erste Problem ist, dass wenn diese
package-private
Klassen wachsen und Sie mehr Klassen möchten, die einzige Möglichkeit, alles verborgen zu halten, darin besteht, Klassen im selben Paket zu erstellen :package abc: -- /* non-public */ Usage.java -- /* non-public */ HelperUsage.java -- /* non-public */ FactoryUsage.java ....
Wenn es wächst (in unseren Fällen), sind diese Pakete viel zu groß. Wechseln Sie zu einem separaten Paket, sagen Sie? Sicher, aber dann das
HelperUsage
undFactoryUsage
wird es seinpublic
und wir haben versucht, das von Anfang an zu vermeiden.Problem Nummer zwei: Jeder Benutzer / Aufrufer unserer Kunden kann denselben Paketnamen erstellen und diese versteckten Klassen erweitern. Es ist uns schon ein paar Mal passiert, lustige Zeiten.
modules
löst dieses Problem auf schöne Weise:public
ist nicht mehr wirklichpublic
; Ich kannfriend
überexports to
Direktive Zugang haben . Dies erleichtert unseren Code-Lebenszyklus und unsere Verwaltung erheblich. Und wir entkommen der Hölle des Klassenpfades. Natürlichmaven/gradle
kümmern wir uns hauptsächlich darum, aber wenn es ein Problem gibt, werden die Schmerzen sehr real sein. Es könnte auch viele andere Beispiele geben.Der Übergang ist jedoch (noch) nicht einfach. Zunächst muss jeder im Team ausgerichtet werden. Zweitens gibt es Hürden. Die größten zwei, die ich noch sehe, sind: Wie trennt man jedes Modul, basierend auf was speziell? Ich habe noch keine definitive Antwort. Die zweite ist
split-packages
, oh die schöne "gleiche Klasse wird von verschiedenen Modulen exportiert". Wenn dies bei Ihren Bibliotheken der Fall ist, gibt es Möglichkeiten, dies zu verringern. aber wenn dies externe Bibliotheken sind ... nicht so einfach.Wenn Sie auf
jarA
undjarB
(separate Module) angewiesen sind , beide jedoch exportierenabc.def.Util
, werden Sie überrascht sein. Es gibt jedoch Möglichkeiten, dies zu lösen. Irgendwie schmerzhaft, aber lösbar.Insgesamt ist unser Code seit der Migration auf Module (und dies immer noch) viel sauberer geworden. Und wenn Ihr Unternehmen ein "Code-First" -Unternehmen ist, ist dies wichtig. Andererseits war ich an Unternehmen beteiligt, bei denen dies von leitenden Architekten als "zu teuer" und "kein wirklicher Vorteil" angesehen wurde.
quelle