If you are planning to distribute a Java app on Mac, you should avoid using the JDK builds from jdk.java.net as they won’t necessarily work on Mac OS older than 10.13. This is because the libjvm.dylib is build with MACOSX_MIN_VERSION set to 10.13. This doesn’t necessarily cause a problem until you try to run a signed app on Yosemite or older (10.10). Your app just won’t open. Checking the logs you’ll receive an error like:
Error: dl failure on line 542 Error: failed /Applications/MyApplication.app/Contents/Java/jre//lib/server/libjvm.dylib, because dlopen(/Applications/MyApplication.app/Contents/Java/jre//lib/server/libjvm.dylib, 10): no suitable image found. Did find: /Applications/MyApplication.app/Contents/Java/jre//lib/server/libjvm.dylib: code signature invalid for '/Applications/MyApplication.app/Contents/Java/jre//lib/server/libjvm.dylib'
Now, you might be fine if you’re building the app on 10.10 or older, but not sure. This particular issue is a combination of:
- libjvm.dylib set with a min version of 10.13.
- codesign on 10.11 and higher automatically signs libs targeting 10.11 and higher with a different signature than is can be understood by gatekeeper pre 10.11.
- Gatekeeper barfing when it hits this signature.
So, If you’re building (signing) your app on the latest Mac OS and you want to be able to distribute it to older versions of OS X, you need to make sure that all of your libraries are built with the MACOSX_MIN_VERSION set to 10.10 or lower.
You can verify this using otool. Inside the standard openjdk build on jdk.net, you can go into the Contents/Home/lib directory, and run:
$ otool -l */libjvm.dylib | grep VERSION -A 5 | grep version version 10.13 version 0.0
(Note: libjvm.dylib is the only problematic one. All the other dylibs are built with 10.8 min version).
However, if you download the build from AdoptOpenJDK, and do the same thing, you’ll find
$ otool -l */libjvm.dylib | grep VERSION -A 5 | grep version version 10.8 version 0.0
Just another reason to use AdoptOpenJDK for your Java distro.