[ https://issues.apache.org/jira/browse/MCOMPILER-265?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
A. Di Matteo updated MCOMPILER-265: ----------------------------------- Description: The Maven Compiler Plugin is producing an IllegalAccessError for the use case below when normal JDK compiler or Eclipse compiler would not. Given the following two classes in package com.sample.package1 {code} package com.sample.package1; abstract class Foo { public String getFoo() { return "foo"; } } {code} and {code} package com.sample.package1; public class Bar extends Foo { public String getBar() { return "bar"; } } {code} And the following test main in package com.sample.package2 {code} package com.sample.package2; import java.util.stream.Stream; import com.sample.package1.Bar; public class Main { public static void main(String[] args) { System.out.println(new Bar().getFoo()); // "foo" Stream.of(new Bar()).map(Bar::getFoo).forEach(System.out::println); // IllegalAccessError } } {code} The following scenarios occur: - Compiling and running the main from Eclipse > No Error - Compiling from console/Maven and running the main from Eclipse > Error, IllegalAccessError - Compiling from console/Maven and running the main via exec:java from console > Error, IllegalAccessError - Compiling from Eclipse and running the main via exec:java from console > No Error Stack trace: {code} java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalAccessError: tried to access class com.sample.package1.Foo from class com.sample.package2.Main at com.sample.package2.Main.lambda$MR$main$getFoo$e8593739$1(Main.java:14) at com.sample.package2.Main$$Lambda$1/1562888899.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at com.sample.package2.Main.main(Main.java:14) ... 6 more {code} Given the following plugin configuration: {code} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> {code} And changing it to the following: {code} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerId>eclipse</compilerId> </configuration> <dependencies> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-compiler-eclipse</artifactId> <version>2.7</version> </dependency> </dependencies> </plugin> {code} Would fix the issue, showing indeed an important difference between the Maven Compiler and the Eclipse Compiler. Further details can be found on the related StackOverflow thread: - http://stackoverflow.com/questions/36100552/demystifying-the-java-lang-illegalaccesserror was: The Maven Compiler Plugin is producing an IllegalAccessError for the use case below when normal JDK compiler or Eclipse compiler would not. As such, this is considered a bug, unless further clarification would be provided as part of this ticket. Given the following two classes in package com.sample.package1 {code} package com.sample.package1; abstract class Foo { public String getFoo() { return "foo"; } } {code} and {code} package com.sample.package1; public class Bar extends Foo { public String getBar() { return "bar"; } } {code} And the following test main in package com.sample.package2 {code} package com.sample.package2; import java.util.stream.Stream; import com.sample.package1.Bar; public class Main { public static void main(String[] args) { System.out.println(new Bar().getFoo()); // "foo" Stream.of(new Bar()).map(Bar::getFoo).forEach(System.out::println); // IllegalAccessError } } {code} The following scenarios occur: - Compiling and running the main from Eclipse > No Error - Compiling from console/Maven and running the main from Eclipse > Error, IllegalAccessError - Compiling from console/Maven and running the main via exec:java from console > Error, IllegalAccessError - Compiling from Eclipse and running the main via exec:java from console > No Error Stack trace: {code} java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalAccessError: tried to access class com.sample.package1.Foo from class com.sample.package2.Main at com.sample.package2.Main.lambda$MR$main$getFoo$e8593739$1(Main.java:14) at com.sample.package2.Main$$Lambda$1/1562888899.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at com.sample.package2.Main.main(Main.java:14) ... 6 more {code} Given the following plugin configuration: {code} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> {code} And changing it to the following: {code} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerId>eclipse</compilerId> </configuration> <dependencies> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-compiler-eclipse</artifactId> <version>2.7</version> </dependency> </dependencies> </plugin> {code} Would fix the issue, showing indeed an important difference between the Maven Compiler and the Eclipse Compiler. Further details can be found on the related StackOverflow thread: - http://stackoverflow.com/questions/36100552/demystifying-the-java-lang-illegalaccesserror > IllegalAccessError trying to access package-private method through public > subclass (for same package) from another package > --------------------------------------------------------------------------------------------------------------------------- > > Key: MCOMPILER-265 > URL: https://issues.apache.org/jira/browse/MCOMPILER-265 > Project: Maven Compiler Plugin > Issue Type: Bug > Affects Versions: 3.5.1 > Environment: Eclipse Mars 4.5.1 > Maven 3.3.3 > JDK 8u31 > Reporter: A. Di Matteo > > The Maven Compiler Plugin is producing an IllegalAccessError for the use case > below when normal JDK compiler or Eclipse compiler would not. > Given the following two classes in package com.sample.package1 > {code} > package com.sample.package1; > abstract class Foo { > public String getFoo() { > return "foo"; > } > } > {code} > and > {code} > package com.sample.package1; > public class Bar extends Foo { > public String getBar() { > return "bar"; > } > } > {code} > And the following test main in package com.sample.package2 > {code} > package com.sample.package2; > import java.util.stream.Stream; > import com.sample.package1.Bar; > public class Main { > public static void main(String[] args) { > System.out.println(new Bar().getFoo()); > // "foo" > Stream.of(new > Bar()).map(Bar::getFoo).forEach(System.out::println); > // IllegalAccessError > } > } > {code} > The following scenarios occur: > - Compiling and running the main from Eclipse > No Error > - Compiling from console/Maven and running the main from Eclipse > Error, > IllegalAccessError > - Compiling from console/Maven and running the main via exec:java from > console > Error, IllegalAccessError > - Compiling from Eclipse and running the main via exec:java from console > No > Error > Stack trace: > {code} > java.lang.reflect.InvocationTargetException > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:483) > at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293) > at java.lang.Thread.run(Thread.java:745) > Caused by: java.lang.IllegalAccessError: tried to access class > com.sample.package1.Foo from class com.sample.package2.Main > at > com.sample.package2.Main.lambda$MR$main$getFoo$e8593739$1(Main.java:14) > at com.sample.package2.Main$$Lambda$1/1562888899.apply(Unknown Source) > at > java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) > at > java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419) > at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) > at > java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) > at > java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) > at > java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) > at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) > at > java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) > at com.sample.package2.Main.main(Main.java:14) > ... 6 more > {code} > Given the following plugin configuration: > {code} > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-compiler-plugin</artifactId> > <version>3.5.1</version> > <configuration> > <source>1.8</source> > <target>1.8</target> > </configuration> > </plugin> > {code} > And changing it to the following: > {code} > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-compiler-plugin</artifactId> > <version>3.5.1</version> > <configuration> > <source>1.8</source> > <target>1.8</target> > <compilerId>eclipse</compilerId> > </configuration> > <dependencies> > <dependency> > <groupId>org.codehaus.plexus</groupId> > <artifactId>plexus-compiler-eclipse</artifactId> > <version>2.7</version> > </dependency> > </dependencies> > </plugin> > {code} > Would fix the issue, showing indeed an important difference between the Maven > Compiler and the Eclipse Compiler. > Further details can be found on the related StackOverflow thread: > - > http://stackoverflow.com/questions/36100552/demystifying-the-java-lang-illegalaccesserror -- This message was sent by Atlassian JIRA (v6.3.4#6332)