当我使用JDK6在Eclipse Mars中调用ANT脚本(Run as> ANT Build…> JRE> Separate JRE),我得到以下错误信息:
问题发生:JRE版本低于1.7不支持
这只是一个bug还是故意的?我在Eclipse中找不到相应的bug报告。所以Eclipse放弃了Java 6对ANT的支持?
- 截图:选择JDK 1.6作为ANT的运行时JRE
- 截图:执行ANT脚本出错
我们使用自定义ANT插件修复了这个问题。它是Mars捆绑ANT插件的替代品。最初的插件不支持Java <因为它是用Java>= 5兼容并删除Java7检查是很容易的。因为它是用Java>
两个语法"问题"是:
- 菱形操作符,如
List<MyObject> list = new ArrayList<>();
- try-with-resources,例如
try (InputStream stream = createInputStream()) { ...}
Diamond操作符的向后兼容性:
List<MyObject> list = new ArrayList<MyObject>();
和for try-with-resources:
InputStream stream;
try
{
...
}
finally
{
stream.close();
}
在我们用自定义插件替换了捆绑插件之后,就可以像往常一样用自定义JRE启动ANT任务了。
可以使用Eclipse git仓库中的原始源代码创建自己的ANT插件:http://git.eclipse.org/c/platform/eclipse.platform.git/refs/tags(使用标签ID: I20150430-1445)或使用我的预编译包:Eclipse Mars ANT插件,支持Java <7
安装方便:
- 下载压缩包*,解压到
/plugins目录 - 使用参数-clean启动eclipse(只有一次)
- 为ANT任务配置JRE6,通过外部工具配置…
关于解决方案的更多细节可以在这篇博客文章中找到。
Eclipse Mars不再支持Java 6:
所以我们必须改为IntelliJ IDEA
:
- https://bugs.eclipse.org/bugs/show_bug.cgi?id=474386
- https://bugs.eclipse.org/bugs/show_bug.cgi?id=461031
这是相当混乱的东西!?我的(Windows 7)环境是这样的:
- Eclipse Neon R2 (4.6.2)
- JDK 1.8启动Eclipse
- JDK 1.6作为Eclipse中的默认JRE
在这个配置中,这个问题的一个"解决方案"(!)是使用键盘快捷键(或RMC-> run as->Ant build)运行构建文件,而不需要在"外部工具配置"对话框中进行任何定制!?
当我使用键盘快捷键(Alt-Shift-X, Q)时,构建文件工作正常(并且它确实从JDK 1.6启动javaw
和javac
,正如我从进程资源管理器中观察到的),但是一旦我对"启动配置"进行修改(例如选择一个新的目标),那么我也开始得到"JRE版本低于1.7不支持"错误!
如果,得到错误后,我去"外部工具配置…"->"删除选定的启动配置",然后用键盘快捷键开始构建,它又工作了!?
显然,@rjahn上面提到的"JDK必须>= 1.7"检查(默认的ant插件)并不总是被执行,但我还没有调试它,看看为什么…
启动ant构建环境需要Java 1.7,但是您可以使用任何JDK编译类文件。默认情况下,在启动环境中使用javac和javaw,但是您可以在ant任务中覆盖它。
我在示例中使用了以下常量:
<property name="javac.location" value="c:/Program Files/Java/jdk1.6.0_45/bin/javac.exe" />
<property name="java.location" value="c:/Program Files/Java/jdk1.6.0_45/bin/javaw.exe" />
Java编译:您可以定义名为"executable"的javac位置参数:
<javac srcdir="@{source.dir}" destdir="@{target.dir}" debug='@{debug}' encoding="UTF-8" fork="true" source="@{source}" target="@{target}" executable="${javac.location}">
之后,使用javac从JDK 1.6编译类文件。
要从ant运行应用程序,使用java 1.6,使用java任务的jvm参数:
<java classname="com.google.gwt.dev.Compiler" fork="yes" failonerror="true" maxmemory="${gwt.compile.maxmemory}" jvm="${java.location}">
一些ant任务在默认情况下使用默认编译器,例如wsimport-ant任务(它从wsdl生成源文件并使用默认java编译它)。为了防止这种情况,使用-Xnocompile参数运行wimport,并使用javac编译生成的源文件(见上文)。
<wsimport-ant xadditionalHeaders="true">
<xjcarg value="-XautoNameResolution" />
<arg value="-d" />
<arg value="${src-gen.dir}/wsdls" />
<arg value="-keep" />
<arg value="@{wsdlsource}" />
<arg value="-Xnocompile" />
</wsimport-ant>
这些方法在最新的eclipse (Neon .3)和Oracle JDK 1.6(或任何其他JDK)中完美地工作。
Java 6和7不再接受Oracle的公开更新。虽然您可以根据旧版本的运行时库进行编译以满足这些需求,但您应该使用较新的JRE来实际运行任何东西。
这简直是愚蠢至极。我们还必须切换回旧版本的eclipse或切换到其他IDE。遗留系统仍然在1.6中运行,当您可以在Mars中使用1.6 jre创建项目时,ant也应该能够针对1.6进行本机编译。
另一个解决方案是在调用javac的地方更新build.xml。在一个公司的建设中,这将是100个地方。
似乎每个eclipse版本都搞砸了一些基本的东西。