Eclipse Mars:ANT不再支持JDK 1.6了?



当我使用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检查是很容易的。

两个语法"问题"是:

  • 菱形操作符,如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启动javawjavac,正如我从进程资源管理器中观察到的),但是一旦我对"启动配置"进行修改(例如选择一个新的目标),那么我也开始得到"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版本都搞砸了一些基本的东西。

最新更新