2017-08-07 233 views
1

好吧,我很确定我错过了这里的一个基本点,但我很难过。我与maven玩弄主要和测试来源在不同层次编译(1.7 & 1.8) - 发现了很多帖子,但还没有得到它的工作,所以回到基础空白项目。所以首先,我想通过让maven 而不是通过将maven-compiler-plugin设置为源级别1.7并使用1.8代码(流)来编译我的代码。maven忽略pom.xml中的sourcelevel

这是我测试代码

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是不是有任何的它和抱怨源级别预计直到我改变它。现在,那为什么运行在命令行行家......当

$ mvn compile 

$ mvn install 

Maven将不抱怨吗?

Maven版本3.5.0
Java版本1.8.0_131

+0

尝试在运行Maven时使用-X选项来查看如何调用javac。它可能会提供有关正在发生的事情的提示。 – ssc327

+0

它实际上打印源= 1.7和目标= 1.7。只是为了确保我添加了一些代码,无论源代码级别如何,都不会编译代码,这确实会导致代码失败。当然是 – enp4yne

回答

1

没有什么在语法不会在Java 7中工作然而,stream()方法只介绍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> 
+1

!这就说得通了。如果我刚刚使用lambdas,我会马上注意到这一点。当我尝试使用lambda时,按预期工作。非常感谢,经验教训:) – enp4yne