Instrumentation best practices question, and more
michael.rasmussen at zeroturnaround.com
Wed Nov 25 22:56:20 UTC 2015
Having recently started looking into the JDK9-jigsaw builds, and the
numerous changes that it entails, to see what impact it has on our
software, I have some initial questions that I haven't been able to
find the answers to so far.
1) There have been some discussions on this mailing list already
regarding escaping the encaptulation of the modules, but I haven't
found anything regarding what the best/recommended practice is for
something like profilers, trace advices, etc or anything else that
instruments classes throughout the system, inserting calls to methods
to perform various tasks.
In JDK8, adding this using a javaagent, my classes were on the boot
classpath, thus accessible to the entire system. But this is no longer
the case in jigsaw -- so how am I supposed to do this in a module-aware
Am I just supposed to hack into the module system, to add edges from
every single module in the system to my agent? While that is doable,
it doesn't sounds very nice, requiring poking a lot of holes using
reflection to bypass the "in-same-module" checks etc.
These kind of instrumentations are not that uncommon in the Java
ecosystem, so I assume there must have been some considerations how
this should be accompliced?
Or is there no recommended way for doing this?
2) Why the backwards-incompatible change to getResourceAsStream
family of methods? Sure, the methods are binary compatible, but
behave very differently than previously!
Object.class.getResourceAsStream("Object.class") now returns null,
apparently just for the sake of it, as the InputStream can easily
be obtained from the Module, without any in-same-module checks, via:
But, accessing this through the Module requires the code to be
compiled against JDK9, having to keep multiple different codepaths in
the code depending on which JDK version I'm loading the resources on!
3) Why was the implementation of java.lang.Package changed, so it no
longer returns the content of the Manifest file?
Previously, doing MyClass.class.getPackage().getImplementationTitle()
would return the "Implementation-Title" entry from the manifest file,
but now it returns null instead.
The documentation in JDK8 even mentions that this information is
typically stored in the manifest, where as the JDK9 now states that
these values are unspecified.
More information about the jigsaw-dev