Ich stand und stehe immer noch der Implementierung des Modulsystems in Java9 ablehnend gegenüber. Neulich war es draußen so, dass ich lieber drin blieb und ich erinnerte mich an eine Test-Suite, die ich bei der Umstellung auf Java8 dazu nutzte, Imkompatibilitäten meiner Anwendungen festzustellen und auszumerzen.
Zu den Test-Themen zählten unter anderem:
Ich reaktivierte also diese kleinen Tests und ließ mich überraschen. Tatsächlich wurde ich auch überrascht: der JAAS-Test schlug fehl. Ich brauchte einige Zeit, dahinterzukommen warum er fehlschlug.
Dazu vielleicht zunächst ein wenig Hintergrund: Das JAAS-Szenario sah so aus, dass ich darüber die Authentifizierung realisierte. Dadurch wird ein Principal aufgebaut, der dann vom SecurityManager benutzt wird um zu prüfen, ob der Code, der gerade ausgeführt wird, auch über die entsprechende Permission verfügt.
Ich benutzte zur Erstellung des Prinzipals den com.sun.security.auth.module.UnixLoginModule. Unter Java8 funktionierte der Test problemlos, unter Java9 wurden keinerlei Permissions vergeben.
Nach langwieriger Suche stellte sich die Situation für mich so dar, dass Oracle selbst das neue Modulsystem nicht restlos durchschaut, denn im Zuge der Arbeit des SecurityManager wird an den Principals die Methode hashCode aufgerufen - die wiederum die Methode toString aufruft, um den Hash aus dem resultierenden String zu errechnen.
Da die Methode toString jedoch die Stringrepräsentation aus ResourceBundles (Stichwort I18n) zusammensetzt, fliegt unter Java9 eine ResourceNotFoundException, weil das benötigte ResourceBundle nicht im Klassenpfad gefunden werden kann.
Das wirklich witzige daran ist, dass man diesen Fehler umgehen kann, wenn man direkt nach dem Login alle Principals des Subject holt und an jedem vorsorglich einmal die toString-Methode aufruft. Zu diesem Zeitpunkt weiß Java noch, wo das ResourceBundle im ClassPath liegt und das sorgt dafür, dass die Ressourcen dann auch gefunden werden, wenn der SecurityManager sie benötigt.
Die Dateien zum Nachvollziehen sind angehängt: Unter Java8 funktioniert die Beispielanwendung mit oder ohne Kommandozeilen-Parameter, unter Java9 funktioniert sie nur mit Kommandozeilenparameter - das schaltet nämlich den Workaround an...
Die Anwendung muss mit den drei System-Properties
Ich habe nicht versucht, ob derselbe Mechanismus mit denselben fatalen Folgen unter Windows zum Tragen kommt.
Ein entsprechender Bug wurde gemeldet und ist zur Zeit intern unter Review.
04.11.2018
Eine Klarstellung zum Thema Java, SecurityManager, Principals und Permissions
16.04.2018
Die Umstellung auf Java9 in meinen eigenen Projekten ist abgeschlossen
25.02.2018
Nachdem ich bereits über den einen oder anderen Bug in Verbindung mit Java 9 berichtet habe, habe ich bereits wieder einen gefunden - und wieder verbunden mit der ach so tollen Erfindung des Java-Modulsystems
25.02.2018
Ich habe bereits über einen Bug in Java9 berichtet, der mich ziemlich überrascht hat. Wer aber beschreibt meine Überraschung, dass der Bug, der mich beim Umstieg von Java7 auf Java8 bereits angespuckt hat, wieder Speichel gesammelt hat?
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.