Eclipse MARS with ANT and JRE 6 (story)
Eclipse Mars is available since June 25th. We didn't update our IDEs because it wasn't needed.
Some days ago we played around with JavaFXPorts Eclipse plugin. This plugin requires Eclipse Mars. So far so good. We made some tests with Mars, and everything was fine. We installed all required plugins for our internal and customer projects and configured a first workspace....
After everything was done, we tried to work with Eclipse Mars - no problems... BUT we have many projects with Java 6 compatibility.
Why Java 6?
Some big legacy projects/applications and Oracle Forms compatibility. There are more reasons, but it's not unusual to be backwards compatible, especially for frameworks and libraries!
Long story, short: It's not possible to start an ANT task with Java 6, because Java 7 is required. A nice error message appears:
BUT it's still possible to choose any JRE in Runtime configuration dialog.
Why shouldn't it be possible to start ANT with "any" JRE?
We tried to find help in the world wide web and found some postings about our problem:
http://stackoverflow.com/questions/31052878/run-eclipse-mars-with-java-1-6
http://stackoverflow.com/questions/31808102/eclipse-mars-ant-doesnt-support-jdk-1-6-anymore
And two bug database entries:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=474386
https://bugs.eclipse.org/bugs/show_bug.cgi?id=461031
It's absolutely incomprehensible why the first ticket is in state: RESOLVED INVALID and the
second one: VERIFIED FIXED.
OK, the second one was for a different requirement, but the first one explains the problem.
Why did the developer ignore the user requirement?
It's possible to call ANT with "any" JRE, without Eclipse and other IDEs don't have such crazy limitations! We didn't plan to use another IDE just for building our software!
I can't live with recommended workarounds because suggested steps were not usuable with big projects!
So, we tried to solve the problem for us. The source code of the ANT plugin is available here, so it shouldn't be a problem to "fix" the problem.
After reading source code, we found that the only reason why it's not possible to use JREs < version 7, is Java 7 Syntax:
- Diamond operator, e.g. List<MyObject> list = new ArrayList<>();
- try-with-resources, e.g. try (InputStream stream = createInputStream()) { ...}
And of course, the plugin was configured for execution environment JavaSE-1.7.
Our solution: Removed Java version check in class org.eclipse.ant.internal.launching.launchConfigurations.AntLaunchDelegate, method launch:
//if (!path.isEmpty()) {
// IPath jrePath = Path.fromPortableString(path);
// IVMInstall vm = JavaRuntime.getVMInstall(jrePath);
// if (vm instanceof AbstractVMInstall) {
// AbstractVMInstall install = (AbstractVMInstall) vm;
// String vmver = install.getJavaVersion();
// // versionToJdkLevel only handles 3 char versions = 1.5, 1.6, 1.9, etc
// if (vmver.length() > 3) {
// vmver = vmver.substring(0, 3);
// }
// int ver = (int) (CompilerOptions.versionToJdkLevel(vmver) >>> 16);
// if (ver < ClassFileConstants.MAJOR_VERSION_1_7) {
// // IStatus status = new Status(IStatus.ERROR, AntLaunching.PLUGIN_ID, 1,
// // AntLaunchConfigurationMessages.AntLaunchDelegate_Launching__0__2, null);
// // throw new CoreException(status);
// }
// }
//}
We set the execution environment for org.eclipse.ant.launching, org.eclipse.ant.core and org.eclipse.ant.ui to JavaSE-1.6 and made the source code compatible with Java 6 syntax.
After we built the required jar files, we had problems with Eclipse, because there was something like a plugin cache (not sure what exactly). We made a test with -clean command line parameter and were happy. It was possible to start ANT tasks - with JRE 6 - without modifications, directly via Eclipse.
It's not difficult to create your own ANT plugin, but here are our jar files.
The libs were built for
Build id: 20150621-1200
The tag-id of the ANT plugin source code: I20150430-1445.
Installation?
- Download the zip archive, extract the content to <eclipse_dir>/plugins.
- Start eclipse with parameter -clean (only once)
- Configure JRE6 for your ANT task, via Externals Tool configuration...
Feel free to use our changed files but we don't guarantee that it doesn't destroy your Eclipse Mars installation
We didn't have any problems so far, but send us your impressions.
We didn't publish the changed source code right now, but let us know if you need it - it's still under EPL.
Check this post:
https://blog.sibvisions.com/2016/06/30/eclipse-neon-with-ant-and-jre6/
and especially the comments!
Only first release of Neon is supported and I don't plan to patch newer versions because of too few interest.
Plugin for Oxygen.1 -> https://blog.sibvisions.com/2017/10/08/eclipse-oxygen-1-with-ant-and-jre6/
How did you build the modified plugin? I'm having troubles to make it work for 2020-03 (4.15)
Do you mean the jars or the whole process?
Yeah, but I did it putting the modified class inside original jar.
I did the same!