Javac Cross-Compilation with 1.7

Eyad Ebrahim picture Eyad Ebrahim · Aug 19, 2013 · Viewed 19.8k times · Source

So guys,

I'm trying to play a bit with Javac Cross compilation with Ant and on terminal. Locally and on an integration environment and i'm having the same problem on the very basic problem.

I run this in the linux terminal (and also on my cygwin on windows and the cmd):

 javac -target 1.6 -source 1.7 -bootclasspath /usr/java/jdk1.6.0_27/jre/lib/rt.jar Main.java

with Main.java with nothing other than a System.out.println.

javac -version ==> javac 1.7.0_11

I'm getting the error message:

javac: source release 1.7 requires target release 1.7

I have roughly the same configuration on my local windows machine with the exact same results.

It was my understanding that cross compilation is all about compiling some source code that is compatible with a higher version jdk using that higher version of jdk, but passing the rt.jar of the target version that is supposedly lower.

if target and source are the same, it worked.

target=1.7 and source=1.7 workd fine

target=1.6 and source=1.6 worked just fine

but i want cross-compilation, so what is it that i'm doing wrong?

I appreciate all the help I could get and thanks in advance.

Answer

vinay picture vinay · Aug 19, 2013

You cannot have a newer version of source and lower version of target. For example, In Java 5, a number of new features were added to the language, such as generics, autoboxing and you cannot expect a JVM 1.4 to understand it. So, you must tell the compiler that your source code is Java 1.4 source code. This explains the results you have.

The default for -target depends on the value of -source:

  • If -source is not specified, the value of -target is 1.7
  • If -source is 1.2, the value of -target is 1.4
  • If -source is 1.3, the value of -target is 1.4
  • If -source is 1.5, the value of -target is 1.7
  • If -source is 1.6, the value of -target is 1.7
  • For all other values of -source, the value of -target is the value of -source.

For more info refer to http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html