【问题标题】:Maven is not obeying Java Compiler Level [duplicate]Maven不遵守Java编译器级别[重复]
【发布时间】:2016-09-25 08:00:17
【问题描述】:

我已安装 JDK 1.8 并将 JAVA_HOME 配置为 JDK 1.8。我正在使用 apache-maven-3.0.5。我创建了一个 maven 项目并将 ma​​ven-compiler-plugin(3.3) <source><target> 配置为 1.7

问题是,如果我使用任何 Java 1.8 功能,例如 String.join()map.remove(key, value),即使我将编译器级别设置为 1.7,它仍然可以成功编译。

我观察到的一件事是,如果我将 JAVA_HOME 指向 JDK 1.7 目录,则会引发编译错误。

但我的期望是,即使当我在 pom.xml 中将编译器级别设置为 1.7 时,我们的 JAVA_HOME 指向 JDK 1.8,它也应该遵守该编译器级别 (1.7) 并抛出错误。

我错过了什么?

PS:当我从我的 Eclipse IDE 运行时,它使用正确的 JDK(1.7) 并给出错误。但是当我从命令行运行它时,我遇到了这个问题。

【问题讨论】:

    标签: java maven


    【解决方案1】:

    你混合了两件事:

    • 编译器(例如default 方法、lambda)
    • java 库/API(例如StreamOptionalString.join

    Maven 只能检查编译器级别,您正在做的是使用 JDK 1.8 中的库,这没关系,除非您希望代码在 JDK 1.7 上运行。

    此外,即使 java 也不总是知道哪些方法/类出现在较新版本的标准库中(并非所有方法/类都标有 @since 标签),因此如果您尝试使用 javac 进行编译,您会得到类似的结果.

    【讨论】:

      【解决方案2】:

      在使用 JDK 8 编译时,更改源和目​​标级别不会检查您是否使用 1.8 API。它只会检查语言功能。

      您可以使用Animal Sniffer Maven plugin 并进行 API 检查,如果您尝试使用 1.8 API,可以将其设置为使构建失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多