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.
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
This is a limit in javac. Note that you could get away with just specifying "-target" (and not -source) in older versions of javac. You might still be able to.
You may want to consider using the Eclipse Java Compiler (ecj) which is available as a standalone compiler, as a maven plugin and which also can be used by the javac task in ant scripts.
See http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.user/tasks/task-using_batch_compiler.htm for details.