Javac Cross-Compilation with 1.7

2022-09-03 02:22:42

所以伙计们,

我正在尝试使用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

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

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


答案 1

不能有较新版本的源和较低版本的目标。例如,在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


答案 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


推荐