2017-08-07 1 views
1

Okay, ich bin mir ziemlich sicher, dass ich hier einen grundlegenden Punkt verpasse, aber ich bin ratlos. Ich spiele mit Maven herum, um Haupt- und Testquellen auf verschiedenen Ebenen zu kompilieren (1.7 & 1.8) - viele Beiträge gefunden, aber noch nicht funktioniert, also zurück zu den Grundlagen mit einem leeren Projekt.maven ignoriert sourcelevel in pom.xml

Also zuerst, ich möchte versuchen, indem maven nicht kompilieren Sie meinen Code, indem Sie das Maven-Compiler-Plugin auf Source-Ebene 1.7 und 1.8 Code (Stream) verwenden.

Das ist mein Testcode:

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

Und das ist mein 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 ist nichts davon mit und beschwert sich über die Quelle Niveau erwartet, bis ich es ändere. Nun, warum ist es, dass, wenn Maven von der Kommandozeile ausgeführt ...

$ mvn compile 

oder

$ mvn install 

Maven nicht beschweren?

Maven Version 3.5.0
Java-Version 1.8.0_131

+0

Versuchen Sie, die Option -X beim Ausführen von Maven zu verwenden, um zu sehen, wie javac aufgerufen wird. Es kann Hinweise auf das geben, was vor sich geht. – ssc327

+0

es druckt tatsächlich Quelle = 1.7 und Ziel = 1.7. Nur um sicher zu sein, dass ich etwas hinzugefügt habe, das den Code nicht kompiliert, unabhängig von der Quellstufe, was tatsächlich dazu führt, dass Maven fehlschlägt. – enp4yne

Antwort

1

Dort in der Syntax ist nichts, die jedoch nicht in Java 7 arbeiten, die stream() Methode nur in JDK 8 eingeführt wurde. Dieser Code wird kompiliert, weil Sie JDK 8 verwenden. Wenn Sie zu einem älteren JDK wechseln, wird Ihr Code beschädigt.

Eine Möglichkeit, solche möglichen Fehler zu verhindern, ist die Animal Sniffer Maven Plugin zu verwenden, die Sie, dass Sie prüfen können, sind nicht Teile des JDK verwenden, die zu neu sind, auch wenn sie gegen die oben genannten neuen JDK Kompilieren:

<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

natürlich! Das macht Sinn. Hätte ich nur Lambdas benutzt, hätte ich das sofort bemerkt. Funktioniert wie vorgesehen, wenn ich versuche, ein Lambda zu verwenden. Vielen Dank, Lektion gelernt :) – enp4yne