17

所以各位,

我正在尝试使用 Ant 和终端上的 Javac Cross 编译。在本地和集成环境中,我在非常基本的问题上遇到了同样的问题。

我在 linux 终端上运行它(也在我的 windows 和 cmd 上的 cygwin 上):

 javac -target 1.6 -source 1.7 -bootclasspath /usr/java/jdk1.6.0_27/jre/lib/rt.jar Main.java

Main.java 除了 System.out.println 什么都没有。

javac -version ==> javac 1.7.0_11

我收到错误消息:

javac: source release 1.7 requires target release 1.7

我在本地 Windows 机器上的配置大致相同,结果完全相同。

据我了解,交叉编译就是使用更高版本的 jdk 编译一些与更高版本 jdk 兼容的源代码,但传递据称较低的目标版本的 rt.jar。

如果目标和源相同,则有效。

target=1.7 and source=1.7 workd fine

target=1.6 and source=1.6 worked just fine

但我想要交叉编译,那么我做错了什么?

我很感激我能得到的所有帮助,并提前感谢。

4

2 回答 2

13

您不能拥有更新版本的源和较低版本的目标。例如,在 Java 5 中,语言中添加了许多新特性,例如泛型、自动装箱,而您不能指望 JVM 1.4 能够理解它。因此,您必须告诉编译器您的源代码是 Java 1.4 源代码。这解释了你得到的结果。

-target 的默认值取决于 -source 的值:

  • 如果未指定 -source,则 -target 的值为 1.7
  • 如果 -source 为 1.2,则 -target 的值为 1.4
  • 如果 -source 为 1.3,则 -target 的值为 1.4
  • 如果 -source 为 1.5,则 -target 的值为 1.7
  • 如果 -source 为 1.6,则 -target 的值为 1.7
  • 对于 -source 的所有其他值,-target 的值就是 -source 的值。

有关更多信息,请参阅http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

于 2013-08-19T19:12:50.687 回答
2

这是 javac 中的一个限制。请注意,您可以在旧版本的 javac 中仅指定“-target”(而不是 -source)。你可能仍然可以。

您可能需要考虑使用 Eclipse Java 编译器 (ecj),它可作为独立编译器使用,作为 maven 插件,也可以由 ant 脚本中的 javac 任务使用。

有关详细信息,请参阅http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.user/tasks/task-using_batch_compiler.htm

于 2013-11-19T14:20:26.320 回答