3

我正在测试javac -source标志,我对它应该如何工作感到有点困惑。

请参阅此代码作为示例。它是不兼容的 Java5 代码,因为isEmpty()在该版本的 JDK 中没有为 String 定义该方法。

public class TestJavac {
   public static void Main(String args[]) {
   String pippo = "pippo";   
   pippo.isEmpty();
   }
}

尝试编译使用:

javac -source 5 TestJavac.java

然后它起作用了!这对我来说听起来很奇怪,但也许有一些我忽略了。我的JAVA_HOME观点1.6 JDK

4

3 回答 3

5

source 选项仅适用于语言级别,不适用于 API(由 JDK 运行时库提供)。

有一个单独的选项 (-bootclasspath -extdirs) 来指定要使用的 JDK(并且您需要获取适当的 jar 文件)。

请注意,还有 -target (控制输出字节码版本)。

您应该始终指定所有(甚至使用较旧的 JDK 进行编译,无论如何您或多或少都需要第二个开关才能工作)

于 2012-08-03T11:00:22.287 回答
2

源标志仅用于验证语言功能,来自-source标志的文档:

1.3  The compiler does not support assertions, generics, or other
     language features introduced after Java SE 1.3.

1.4  The compiler accepts code containing assertions, which were 
     introduced in Java SE 1.4.

1.5  The compiler accepts code containing generics and other language 
     features introduced in Java SE 5.

5    Synonym for 1.5.

1.6  No language changes were introduced in Java SE 6. However, encoding 
     errors in source files are now reported as errors instead of warnings 
     as in previous releases of Java SE.

6    Synonym for 1.6.

1.7  This is the default value. The compiler accepts code with features 
     introduced in Java SE 7.

如您所见,Java 6 中没有引入任何更改。

于 2012-08-03T11:03:40.867 回答
1

-source仅检查 java 语法,不检查包含的库。例如它忽略了@since 1.6:(

同样-target会产生类,这些类将在旧版本的 JVM 上加载但可能无法运行。

http://vanillajava.blogspot.co.uk/2012/02/using-java-7-to-target-much-older-jvms.html

于 2012-08-03T11:01:43.033 回答