Setting "java.library.path" programmatically


When messing around with JNI, one has to set the java.library.path accordingly.
Unfortunately the only way is to add a system property *before* the application is started:

java -Djava.library.path=/path/to/libs

Changing the system property later doesn’t have any effect, since the property is evaluated very early and cached.
But the guys over at jdic discovered a way how to work around it. It is a little bit dirty – but hey, those hacks are the reason we all love Java…

System.setProperty( "java.library.path", "/path/to/libs" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

Explanation

At first the system property is updated with the new value. This might be a relative path – or maybe you want to create that path dynamically.

The Classloader has a static field (sys_paths) that contains the paths. If that field is set to null, it is initialized automatically.
Therefore forcing that field to null will result into the reevaluation of the library path as soon as loadLibrary() is called…

Legos auf dem Boden


Wer kennt das nicht - deine Kinder haben fleißig gespielt und der gesamte Boden ist mit Legos bedeckt. Während sich die Kinder so wohlfühlen, möchtest du gerne, dass sie wieder aufräumen - die Vorstellung Nachts auf dem Weg zum Kühlschrank ein Lego zu erwischen...

Du schätzt, dass etwa 2.000 Lego-Steine auf dem Boden liegen. Daher nimmst du eine Kiste und bittest deine Kinder diese mit 2.000 Lego-Steinen zu füllen.

Die Kinder machen sich sofort ans Werk und zählen laut mit. Du erkundigst dich regelmäßg nach dem aktuellen Stand:

Die erste Antwort:

411

Etwas später:

877

Irgendwann haben sie es geschafft: Sie überreichen dir stolz und zufrieden die Kiste mit exakt 2.000 Lego-Steinen.
Da die Zählerei doch recht lange gedauert - aber es ist geschafft.

Als du nachts in die Küche schleichst, trittst du prompt auf einen Lego-Stein. Mit einem Schmerzensschrei machst du das Licht an: Auf dem Boden befinden sich nach wie vor jede Menge Steine.

Was ist falsch gelaufen?

  • Deine ursprüngliche Schätzung war zu niedrig
  • Die ganze Zählerei hat viel Zeit gekostet
  • Deine Kinder haben genau das gemacht um was du sie gebeten hast
  • Du hast nicht das bekommen, was du eigentlich wolltest

Und die Moral von der Geschicht?

Wenn du den Boden aufgeräumt haben möchtest, dann spielt es absolut keine Rolle wie viele Lego-Steine in die Kiste gepackt wurden.
Die Zählerei macht im Gegenteil das Projekt schwieriger, umfangreicher und nervig.

Du hättest stattdessen deine Kinder bitte sollen:

Bitte sorgt dafür, dass der Boden wieder frei ist.

Denn das ist es was du eigentlich möchtest. Und dieses Ziel wäre einfacher und schneller zu erreichen gewesen.

Daher sollten wir uns (nur) auf das konzentrieren, was wir auch wirklich erreichen wollen.
Und nicht auf irgendeine unwichtige Kennzahl, die man sich manchmal so wünscht (wie z.B. die Anzahl gearbeiteter Stunden...)

Das ist für alle Beteiligten von Vorteil.

Die Zukunft des Oracle JDK

Und die Alternativen


Mit Version 11 wird das Oracle JDK nicht mehr unter allen Umständen kostenlos zur Verfügung stehen.

Spätestens wenn man Sicherheits-Updates länger als 6 Monate erhalten möchte, wird man beim Einsatz des OracleJDKs nicht mehr um Zahlungen herum kommen.

Die gute Nachricht:

From Java 11 forward, therefore, Oracle JDK builds and OpenJDK builds will be essentially identical.

Es gibt also aus technischer Sicht keinen Grund mehr, das Oracle JDK zu benutzen.

Daher sollte bei einer Migration auf Java 11 auch gleichzeitig die Migration auf das OpenJDK ins Auge gefasst werden.

Support für das OpenJDK

Oracle selbst wird (aller Voraussicht nach) für das OpenJDK nur 6 Monate lang Sicherheitsupdates liefern. Allerdings hat sich Red Hat inzwischen verpflichtet dies zu übernehmen.

So wird z.B. das OpenJDK 8 bis mindestens Juni 2023 unterstützt.

Adopt OpenJDK

Unter der Adresse adoptopenjdk.net finden sich aktuell etliche Unterstützer zusammen, die das OpenJDK unterstützen.

Support für Java 11 LTS

Bereits heute wird der aktive Support des OpenJDK 11 bis September 2022 garantiert.

Es ist davon auszugehen, dass die LTS-Versionen von Red Hat (und auch IBM) noch deutlich länger unterstützt werden.

Was tun?

Wir empfehlen unseren Kunden folgendes Vorgehen:

  • Umstieg auf Java 11 und gleichzeitig das OpenJDK (bis spätestens Januar 2019)
  • Später: Umstieg auf die jeweiligen OpenJDK LTS Nachfolgeversionen

Ich kann/möchte nicht auf Java 11 umstellen

Das Oracle JDK 8 wird nur noch bis Januar 2019 kostenlos unterstützt.

Daher bleiben zwei Möglichkeiten:

  • Umstieg auf das OpenJDK 8 (bis spätestens Januar 2019)
  • OracleJDK weiter nutzen - dann mit Lizenzzahlungen für Sicherheitsupdates

Kontakt