Hi Paul,

On 12/18/2015 05:14 PM, Paul Benedict wrote:
Adding read edges at runtime is not a backward compatible solution. Jigsaw should automatically allow you to read anything your Module Descriptor gives you access to -- required or optional.

I was maybe not clear enough. So here's in the example. Suppose module A is a root module (the one mentioned in java -m option):

module A {
    requires B;
}

...searches for module B on -module-path and adds it to runtime configuration, failing to start the program if B is not found. If B is found it adds a read edge from A -> B.

module A {
    requires optional B;
}

... doesn't search for module B but still adds a read edge from A -> B if B happens to be included in the configuration by some other means. The 'other means' could be anything from:

- some other module that is already a part of configuration "requires B" (say a root application module directly or a transitive dependency)
- adding -addmods B command line option
- deployment descriptor of a .mwar application says so


I can certainly say that this is backward compatible in code. The code stays the same.

I'm all *for* intorducing optional dependencies concept into the deployment descriptor. It's just that I don't see -modulepath as an equivalent to -classpath in the sense that optional dependency should make module part of the configuration when it happens to be searchable.

Regards, Peter


Cheers,
Paul

On Fri, Dec 18, 2015 at 10:02 AM, Peter Levart <peter.lev...@gmail.com <mailto:peter.lev...@gmail.com>> wrote:



    On 12/18/2015 04:49 PM, Peter Levart wrote:

        You can check whether the optional module is included in a
        runtime configuration or not with a simple Class.forName()
        check even if you don't depend on the module (i.e. don't list
        it in "requires" descriptor at runtime). The visibility of
        classes is not restricted. It only depends on ClassLoader
        hierarchy. When you successfully resolve some optional class
        at runtime (with Class.forName), you then have to add a read
        edge to it's module:

            Class<?> optionalClass = Class.forName("...");
        MySelfClass.getModule().addRead(optionalClass.getModule());

        ...before invoking any code that uses this module.


    Just had an idea!

    Optional dependency at runtime could add a read edge to the module
    if that module was included in the configuration, but would
    otherwise not cause that module to be included in the
    configuration by itself. How does that sound? Spring would work as
    before - no .addRead() calls needed. Just
    Class.forName("OptionalClass").

    Regards, Peter



Reply via email to