【问题标题】:Usage of -source in javacjavac中-source的使用
【发布时间】:2019-05-06 13:22:59
【问题描述】:

来自docs

-source release 指定接受的源代码版本。

如果我有一个 JDK 版本,比如 1.8,我提到了 -source=1.6,这是什么意思?这是否仅仅意味着我写的任何代码都可以被JDK 1.6或更高版本的javac编译?

如果是这样,为什么在javac 命令期间传递-source=1.6?因为这将生成.class 文件,因此没有源代码可标记(源代码兼容 1.6 或更高版本)?在 javac 命令之后,我们得到的只是字节码,没有.java 文件。

【问题讨论】:

    标签: java


    【解决方案1】:

    这是否仅仅意味着我写的任何代码都可以被JDK 1.6或更高版本的javac编译?

    没有。

    -source=1.6 选项意味着您的代码只能使用属于 Java 6 和 早期 版本的 Java 语言的 Java 语言结构。

    例如,任何 Java 8 lambda 或 Java 9 var 声明都将被标记为编译错误。

    【讨论】:

    • 所以,我提到了-source=1.6,那么为什么人们提到-target 比来源说1.8 高?目标 1.6 应该足够了,如果他们想要的话,应该在 jdk 1.8 上运行?
    • 这是一个不同的问题。但在我试图解释为什么“人”这么说之前,我需要先看一下上下文。
    • 我见过一些这样的例子。
    【解决方案2】:

    Java8 引入了 lambda 表达式。如果您使用 -source=1.6 编译您的应用程序,编译器将不允许 lambda 表达式,尽管 JDK8 支持它。

    【讨论】:

      【解决方案3】:

      如果我有一个 JDK 版本,比如 1.8,我提到 -source=1.6,这是什么意思?这是否仅仅意味着我写的任何代码都可以被JDK 1.6或更高版本的javac编译?

      如果您的代码使用 Java 8 功能,它甚至无法使用 -source=1.6 进行编译。否则,不一定正确,但通常是的,它应该适用于 Java 6 及更高版本。

      如果是这样,为什么在 javac 命令期间传递 -source=1.6 ?因为这会生成 .class 文件,因此没有源代码可以标记(源代码与 1.6 或更高版本的兼容性)?在 javac 命令之后,我们得到的只是字节码,没有 .java 文件。

      Javac 是 Java 编译器。当然它会生成 .class 文件,因为那是 java 程序的编译形式。你为什么要通过?假设您要针对特定​​版本,这是保持该级别支持的最简单方法。

      您可以使用 Java 8 功能(lambdas、streams、datetimeformatter)对此进行测试,然后尝试编译。您的编译将失败。

      【讨论】:

        【解决方案4】:

        通过在编译器上指定 source 参数,您是在告诉编译器您希望您提交的源代码符合该 Java 版本,并检查您选择的版本的特定语言功能(默认为通常是最新版本,即使您自己没有指定源版本)。文档清楚地说明了哪些值是可接受的,哪些值是默认值。这不会更改您的源代码或将您的代码转换为旧版本,它只会提醒您是否正在使用更高版本的 Java 中的功能。如果您没有使用 Java 语言的更新功能,那么这将像往常一样简单地编译您的代码并生成类文件。

        javac MyProgram.java -source 1.6
        

        上面的命令将告诉编译器将源代码视为与 Java 1.6 版兼容。

        以下是 JDK 1.8 的允许值和文档中的描述。

        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 earlier releases of Java Platform, Standard Edition.
        
        6 Synonym for 1.6.
        
        1.7 The compiler accepts code with features introduced in Java SE 7.
        
        7 Synonym for 1.7.
        
        1.8 This is the default value. The compiler accepts code with features introduced in Java SE 8.
        
        8 Synonym for 1.8.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-18
          • 2012-07-04
          相关资源
          最近更新 更多