javac not enforcing module boundaries?

Jonathan Gibbons jonathan.gibbons at oracle.com
Tue Sep 15 00:09:22 UTC 2015


https://bugs.openjdk.java.net/browse/JDK-8136505

-- Jon

On 09/14/2015 01:22 AM, Peter Levart wrote:
> Hi,
>
> I experimented a little with EA build and found javac behaving a 
> little strange. Is this known or expected behaviour?
>
> For example, having the following layout of sources:
>
> modsrc/modA/module-info.java
>
>     module modA {
>         requires modB;
>     }
>
> modsrc/modA/pkgA/TestA.java
>
>     package pkgA;
>
>     import pkgB.TypeB;
>
>     public class TestA {
>         public static void main(String[] args) {
>             TypeB b = new TypeB();
>             b.getC().getD().helloD();
>         }
>     }
>
> modsrc/modB/module-info.java
>
>     module modB {
>         exports pkgB;
>         requires modC;
>     }
>
> modsrc/modB/pkgB/TypeB.java
>
>     package pkgB;
>
>     import pkgC.TypeC;
>
>     public class TypeB {
>         public TypeC getC() {
>             return new TypeC();
>         }
>     }
>
> modsrc/modC/module-info.java
>
>     module modC {
>         exports pkgC;
>         requires modD;
>     }
>
> modsrc/modC/pkgC/TypeC.java
>
>     package pkgC;
>
>     import pkgD.TypeD;
>
>     public class TypeC {
>         public TypeD getD() {
>             return new TypeD();
>         }
>     }
>
> modsrc/modD/module-info.java
>
>     module modD {
>         exports pkgD;
>     }
>
> modsrc/modD/pkgD/TypeD.java
>
>     package pkgD;
>
>     public class TypeD {java -modulepath modout -m modA/pkgA.TestA
>         public void helloD() {
>             System.out.println("Hello from " + 
> this.getClass().getModule());
>         }
>     }
>
>
> and using the following command to compile them:
>
> javac -modulesourcepath modsrc -d modout modsrc/modA/pkgA/TestA.java
>
> They compile without error and produce the following output files:
>
> modout/modA/module-info.class
> modout/modA/pkgA/TestA.class
> modout/modB/module-info.class
> modout/modB/pkgB/TypeB.class
> modout/modC/module-info.class
> modout/modC/pkgC/TypeC.class
> modout/modD/module-info.class
> modout/modD/pkgD/TypeD.class
>
>
> Running the above with the following command:
>
> java -modulepath modout -m modA/pkgA.TestA
>
>
> Gives the following runtime error:
>
> Exception in thread "main" java.lang.IllegalAccessError: class 
> pkgA.TestA (in module: modA) cannot access class pkgC.TypeC (in 
> module: modC), modA cannot read modC
>         at pkgA.TestA.main(modA@/TestA.java:8)
>
>
> Which is expected. What I didn't expect is that javac did not figure 
> this out correctly. Am I missing something and not using javac in the 
> right way?
>
>
> Regards, Peter
>



More information about the jigsaw-dev mailing list