To apply some more color, we have introduced a TCCL contract (What Brian was reffering to) in upstream master (which will be released in 7.0.2).
This will make it much easier to deal with as you mention legacy code, and also JDK APIs which just were not designed for a modular world.
As of 7.0.2:
- The TCCL during any MSC Service will be the defining classloader
- The TCCL during any management operation (includes extensions) will be the defining CL
So in a nutshell single arg ServiceLoader will work in 7.0.2. Although maybe you want to try our local master before that?