Maven 忽略 pom.xml 中的 sourcelevel

maven ignores sourcelevel in pom.xml

好吧,我很确定我在这里遗漏了一个基本点,但我很困惑。我正在使用 Maven 来获取主要和测试源代码以在不同级别(1.7 和 1.8)进行编译 - 找到了很多帖子但还没有让它工作,所以回到一个空项目的基础。

所以首先,我想尝试通过将 maven-compiler-plugin 设置为源代码级别 1.7 并使用 1.8 代码(流),让 maven not 编译我的代码。

这是我的测试代码

public static void main(String[] args) {
    new ArrayList<>().stream();
}

这是我的 pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

IntellIJ 没有任何它,并按预期抱怨源代码级别,直到我更改它。现在,为什么从命令行 运行 maven...

$ mvn compile

$ mvn install

Maven 不会抱怨?

maven 版本 3.5.0
java 版本 1.8.0_131

语法中没有任何内容在Java7中不起作用。但是,stream()方法仅在[=17=中引入]JDK 8. 这段代码可以编译,因为你碰巧使用的是 JDK 8. 如果你切换到旧的 JDK,你的代码将被破坏。

防止此类潜在错误的一种方法是使用 Animal Sniffer Maven Plugin,它允许您检查您是否没有使用太新的 JDK 部分,即使在针对前面提到的新 JDK:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>animal-sniffer-maven-plugin</artifactId>
  <version>1.15</version>
  <configuration>
    <signature>
      <groupId>org.codehaus.mojo.signature</groupId>
      <artifactId>java17</artifactId>
      <version>1.0</version>
    </signature>
  </configuration>
  <executions>
    <execution>
      <id>animal-sniffer</id>
      <phase>compile</phase>
      <goals>
        <goal>check</goal>
      </goals>
    </execution>
  </executions>
</plugin>