Domino 11's Java Switch Fallout
Jan 7, 2020, 10:50 AM
- AbstractCompiledPage, Missing Plugins, and MANIFEST.MF in FP10 and V10
- Domino 11's Java Switch Fallout
- fontconfig, Java, and Domino 11
- Notes/Domino 12.0.2 Fallout
In Notes and Domino 11, HCL switched from using IBM's J9 Java distribution to using the OpenJ9 variant of AdoptOpenJDK. This is a lateral move technically - it's still Java 8 - and it's one presumably made in the short term to avoid licensing costs from IBM and in the long term to align better with AdoptOpenJDK.
However, OpenJ9 is not the same as J9, and AdoptOpenJDK is not the same distribution as the previous one, so there are some minor gotchas to look out for.
BASE64 and Other Internal Classes
A couple months back, I wrote a post describing this situation: namely, that some XPages and agents grew to depend on the presence of JVM-internal classes in the
com.ibm namespace, particularly
com.ibm.misc.BASE64Encoder and its decoder sibling.
The true fix for this is to ferret out uses of these classes in your code base, but that can be difficult. If you have to maintain legacy code, I made a small shim Jar you can drop on your server to map the two BASE64 classes to their
sun.misc versions. I intentionally use those classes, even though they're also not for public use, both because they have the same semantics as the IBM ones and to reinforce that the best solution is to use the vendor-independent
It's been fairly-common practice for a little while now to create a file named "java.pol" in the Java installation directory to loosen the security policy and get around Domino's bizarrely-strict interpretation of the rules. This came into vogue in favor of editing "java.policy" because this file was (usually) not overwritten during Notes/Domino version upgrades.
However, as Per Lausten discovered, AdoptOpenJDK's distribution does not reference this file, and so its policy changes won't take effect. The upshot of this is that there are three main options to loosen the policy:
- As Per mentions (via Daniele Vistalli), you can create a file named ".java.policy" in the home directory of the user running Domino and it will be honored.
- You can go back to editing the "java.policy" file, and re-editing it with each new release
- You can modify "java.security" to reference "java.pol" again. This is kind of a wash, though, since you'll need to re-edit "java.security" every update anyway
Different Implementation Jars
This last one is much more limited in scope, and may actually be limited in effect to just the NSF ODP Tooling project. In that project, in order to create a Domino-compatible runtime environment for local compilation, I included a couple expected Jars from the Notes/Domino installation in the runtime's classpath. One of these was "ibmpkcs.jar", which covers both some security stuff but also the aforementioned BASE64 classes.
The fix in my case was to just make the resolution of that Jar optional, which should work for the normal case, but it'll be something to keep an eye on in the future.
Karsten Lehmann - Jan 7, 2020, 10:58 AM
An additional benefit of the .java.policy solution in the home directory is that a simple agent can write that file. And it's not restricted to the server platform btw :-)
Daniele Vistalli - Jan 7, 2020, 6:07 PM
We?re likely going to have java.pol back https://domino-ideas.hcltechsw.com/ideas/DOMINO-I-1105
Fredrik Malmborg - Jan 8, 2020, 2:37 AM
We have an agent running on the server that makes sure our policies are in the java.policy. Then you don?t forget it after an upgrade. You can have an agent run after a server start.