You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "A. Di Matteo (JIRA)" <ji...@apache.org> on 2016/03/20 21:53:33 UTC
[jira] [Updated] (MCOMPILER-265) IllegalAccessError trying to
access package-private method through public subclass (for same package)
from another package
[ 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)