Java Getriebe

Java und NetBeans

Plattformwechsel auf NetBeans 8.1

Das NetBeans Team hat für die Version 8.1 der NetBeans Plattform ein paar „gemeine“ Änderungen an den Modulen und deren Abhängigkeiten gemacht. Zum einen sind dies Änderungen um die verschiedenen JRE-Profile aus Java8 besser berücksichtigen zu können und zum anderen sind es (denke ich) erste Vorbereitungen für die neue Modularität von Java 9.

Vorrangig wurden aus den Modulen „Filesystem API„, „Progress API“ und „Project API“ alle diejenigen Klassen in ein eigenes Modul ausgelagert, die mit Swing zu tun haben. Damit werden die eigentlichen Module frei von UI Klassen und können somit auch mit den Kompakten Profilen von Java 8 zusammen genutzt werden. So lassen sich auch NetBeans Anwendungen schreiben, die tatsächlich komplett ohne UI auskommen. Durch einen automatischen Upgrade-Mechanismus des NetBeans Modulsystems lassen sind eigentlich keine direkten Aktionen notwendig. NetBeans fügt automatisch die fehlenden Module als Abhängigkeit hinzu und der Nutzer merkt von dem eigentlich nichts.

Bei der Gelegenheit hat das NetBeans Team aber eine weitere Änderung durchgeführt. Im Modul „Module System API“ gibt es jetzt „Support for binary compatibility patches„. Soweit wie ich es bisher verstanden habe, bietet sich dadurch eine Möglichkeit Klassen in einem anderen Modul durch eine eigene Version zu ersetzen oder zu erweitern. Es lassen sich also zum Beispiel veraltete Methoden oder Konstruktoren aus einer Klasse entfernen und durch einen „Patch“ diese Methoden der Klasse künstlich wieder hinzufügen. Die Klassenlader von NetBeans übernehmen dabei die Verwaltung, welche Methode aus welcher Implementierung verwendet werden soll. Dies hat den Vorteil, dass alle Nutzer der API nur noch die „neue“ Version zu sehen bekommen, aber alter Code, der die „alte“ API noch verwendet weiterhin funktioniert.

Bei der Umstellung auf NetBeans 8.1 betrifft dies vor allem die „Filesystem API“ und auch die „Progress API“. Es gibt Module mit einer „8.0 Campatibility“ im Namen, die sicherstellen, dass jede API, die in NetBeans 8.0 funktioniert hat dies auch unter NetBeans 8.1 noch tut. Durch das automatische Upgrade werden diese Module automatisch mit geladen. Zum Problem wird dies, wenn man in seiner eigenen RCP diese Kompatibilitätsmodule nicht haben möchte und diese daher deaktiviert. Der Compiler kann die Modulnamen nicht auflösen und bricht mit einem Fehler ab. Erst wenn die Versionsnummer in der Abhängigkeit auf einen aktuellen Stand bringt wird kein automatisches Upgrade mehr durchgeführt und somit sind auch die Kompatibilitätsmodule nicht mehr notwendig.

Genau dieser Umstand nötigt und gerade dazu jedes einzelne der mehr als 200 Module unserer „WZL Gear Toolbox“ anzufassen und dort die Abhängigkeiten auf einen aktuellen Stand zu bringen. Bei dieser Aktion habe ich das Ant-Target „fix-dependecies“ in den Modulen zum ersten Mal wirklich schätzen gelernt.

Nachtrag 17.02.2016: Um das fix-dependecies für alle Module einer Suite nacheinander ausführen zu können reicht ein einfaches Target in der build.xml der Suite:

1
2
3
  <target name="fix-all" depends="-init">
    <subant buildpath="${modules.sorted}" target="fix-dependencies"/>
  </target>

Man sollte während dieses Prozesses die „Kompatibilitätsmodule“ vorübergehend wieder aktivieren, da ansonsten der Fix nicht korrekt arbeiten kann. Ist alles Aktualisiert können/sollten die Module wieder deaktiviert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.