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

3
当我在Eclipse Mars中使用JDK6调用ANT脚本(运行为> Ant Build ...> JRE>单独的JRE)时,会出现以下错误信息:
问题出现:JRE版本低于1.7不受支持。 这只是一个bug还是有意为之?我在Eclipse中找不到相应的错误报告。所以Eclipse放弃了对ANT的Java 6支持!

1
可能是使用Java 1.6运行Eclipse Mars的重复问题。 - BackSlash
你在哪里收到这条消息的? - greg-449
在用户界面的哪个位置? - nitind
2
这不是重复的问题。它与Mars运行的JVM版本无关。在我的设置中,Mars使用Java 1.8运行。 - Patrick
请参见 https://www.eclipse.org/forums/index.php/t/1083484/。 - Dominic Cerisano
6个回答

5
我们使用了一个自定义的ANT插件来解决问题。它是Mars捆绑的ANT插件的替代品。原始插件不支持Java < 7,因为它是用Java 7语法编写的,而且还有一个检查Java版本的功能。很容易将Java7语法替换为与>= 5兼容的语法,并删除Java 7检查。
这两个语法“问题”是:
  • 钻石操作符,例如 List<MyObject> list = new ArrayList<>();
  • try-with-resources,例如 try (InputStream stream = createInputStream()) { ...}
钻石操作符的向后兼容:
List<MyObject> list = new ArrayList<MyObject>();

并且对于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),或者使用我预编译的捆绑包:支持Java<7的Eclipse Mars ANT插件

安装非常简单:

  • 下载zip文件*,将内容提取到<eclipse_dir>/plugins。
  • 使用参数-clean启动eclipse(仅一次)
  • 通过Externals Tool configuration...为你的ANT任务配置JRE6。

有关此解决方案的更多详细信息,请参见此博客文章


1

启动ant构建环境需要Java 1.7,但你可以使用任何JDK编译类文件。默认情况下,ant使用启动环境中的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}">

在此之后,使用 ant 和 JDK 1.6 编译类文件。
要使用 java 1.6 在 ant 中运行应用程序,请使用 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参数运行wsimport,并使用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)完美地运行。

1

1
使用IDEA并不是一个缺点,但是关于你的问题:为什么不使用Java 8并使用目标和源1.6进行编译(参见https://ant.apache.org/manual/Tasks/javac.html)? - Thomas S.

1
这里有一些混乱的问题!我的(Windows 7)环境如下:
- Eclipse Neon R2 (4.6.2) - JDK 1.8 用于启动Eclipse - JDK 1.6 作为Eclipse中默认的JRE
在这种配置下,解决这个问题的一个“方法”是通过键盘快捷方式运行构建文件(或右键单击->运行为->Ant Build),而不需要在“External Tools Configuration”对话框中进行任何自定义!
当我使用键盘快捷键(Alt-Shift-X, Q)时,构建文件可以正常工作(它会从Process Explorer中观察到启动javaw和JDK 1.6中的javac),但是一旦我修改了“launch configuration”(比如选择一个新目标),那么我也会开始出现“不支持低于1.7版本的JRE”的错误!
如果在出现错误后,我进入“External Tools Configuration...” ->“Delete selected launch configuration(s)”,然后使用键盘快捷键启动构建,它又可以正常工作了!

显然,@rjahn上面提到的默认ant插件的“JDK必须为>=1.7”检查并不总是被执行,但我还没有完全调试它以查看原因...


0

1
有大量的商业项目绑定到特定的Java版本。使用Eclipse Kepler,我们能够编译Java 1.4。没有技术原因让Eclipse停止支持Java 1.6项目。 - Patrick
1
除了Oracle以外,还有其他JVM实现可能会得到更新/本来就没有同样的问题(大部分安全修复都是针对浏览器插件的),或者一些JVM只支持Java 6级别的API。另外,如果JVM在一些工厂机器上使用(不是普通计算机,更像制造机器),如果它们没有连接/无法访问互联网,它们可能根本不会被更新。 在这种情况下,最好在开发中使用Java 6运行所有内容,以确保不会意外地使用任何Java 7内容。 - Bjarne Boström

0

这只是纯粹的愚蠢。我们要么必须切换回旧版本的eclipse,要么切换到其他IDE。遗留系统仍在1.6中运行,当您可以使用1.6 jre在Mars中创建项目时,ant也应该能够本地编译它以针对1.6。

另一种解决方案是更新您在其中调用javac的build.xml。在企业构建中,可能会有数百个位置。

似乎每个eclipse版本都会搞砸一些基本事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接