Hi,

I'm having one module which defines a service interface but does not export
that interface's package. In another module I wish to create an
implementation of that service, which should be possible via --add-exports.

I can successfully compile that second module, but running it fails:

    Error occurred during initialization of boot layer
    j.l.m.ResolutionException: Module com.example.b does not read a module
that exports com.example.a

It seems as if the service binding happens before the --add-exports of the
java invocation is processed. Please see below for the steps to reproduce.

Is it a bug or am I trying to do something unsupported here?

Thanks,

--Gunnar

=====
mkdir -p sources/com.example.a/src/main/java/a/
mkdir -p sources/com.example.b/src/main/java/b/

cat > sources/com.example.a/src/main/java/a/Hello.java << EOF
package a;

public interface Hello {
    void world();
}
EOF

cat > sources/com.example.a/src/main/java/module-info.java << EOF
module com.example.a {}
EOF

cat > sources/com.example.b/src/main/java/b/HelloImpl.java << EOF
package b;

public class HelloImpl implements a.Hello {

    public void world() { System.out.println( "Hello"); }

    public static void main(String... args) {
        java.util.ServiceLoader.load( a.Hello.class ).findFirst().get()
            .world();
    }
}
EOF

cat > sources/com.example.b/src/main/java/module-info.java << EOF
module com.example.b {
    requires com.example.a;
    provides a.Hello with b.HelloImpl;
    uses a.Hello;
}
EOF

cd sources/com.example.a && javac -g -d ../../modules/com.example.a $(find
src/main/java -name "*.java") && cd ../..

cd sources/com.example.b && javac -g --add-exports
com.example.a/a=com.example.b --module-path ../../modules -d
../../modules/com.example.b $(find src/main/java -name "*.java") && cd ../..

java --add-exports com.example.a/a=com.example.b --module-path modules -m
com.example.b/b.HelloImpl

Reply via email to