I have these classes:
public class EntityDataModel<T extends AbstractEntity>
{
...
}
public abstract class BarChartBean<E extends ChartEntry, T>
{
protected EntityDataModel<? extends T> currentModel;
...
}
I can compile and run this code on eclipse without problem, but when I invoke mvn compile
, this error is thrown:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project edea2: Compilation failure: Compilation failure:
[ERROR] C:\Develop\...\BarChartBean.java:[53,30] error: type argument ? extends T#1 is not within bounds of type-variable T#2
[ERROR] where T#1,T#2 are type-variables:
[ERROR] T#1 extends Object declared in class BarChartBean
[ERROR] T#2 extends AbstractEntity declared in class EntityDataModel
The error is pretty self-explanatory, and theoretically speaking, javac is right and eclipse compiler is wrong.
Why there's such a difference?
Here you are the details of the environment:
Eclipse
Maven
maven-compiler-plugin:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
Question: How can I align the eclipse compiler behavior to javac (but I don't want to use javac in eclipse)?
That's yet another mismatch between the Eclipse Java compiler and the official JDK compiler (because these are different indeed). And javac is not always the right actor in this game, you can indeed hit a javac bug not occurring in the Eclipse compiler.
A similar issue has already been reported: Bug 456459: Discrepancy between Eclipse compiler and javac - Enums, interfaces, and generics.
To align Maven with Eclipse, you can configure the maven-compiler-plugin
as following:
<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>
Basically, you are telling Maven to use the Eclipse Java compiler. I was able to reproduce your issue and applying this configuration the Maven build was then fine. However, I would not recommend this approach.
On the other hand, to configure Eclipse to use the JDK compiler is a bit more difficult, basically because the Eclipse compiler is part of the IDE features. A procedure is explained in the Stack Overflow q/a: How to run Javac from Eclipse.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With