Hintergrund:
Wir haben maven
-basiertes Java-Projekt, das auf JRE 1.7 abzielt, aber der Quellcode verwendet lambdas, daher verwenden wir retrolambda
für die Umwandlung von Java 8
Quellcode in Java 7
. Außerdem verwenden wir StreamSupport Backport-Bibliothek, wenn wir Streams, Funktion. *, Optional usw. benötigen.
Bei der Verwendung von retrolambda
wird die Quell- und Zielsprache des Projekts auf 1,8 konfiguriert.
Alles funktioniert gut, wenn es keine Abhängigkeiten zu Java-Klassen oder -Methoden gibt (wie java.util.stream.*
, java.util.Optional
oder Methoden, die in java8
wie Collection.forEach
eingeführt wurden). Wenn solche Verwendungen vorhanden sind, werden Build-Pässe erstellt, die jedoch in Runtime fehlschlagen, wenn sie unter JVM von Java 8 ausgeführt werden.
Frage:
Mein Ziel ist es, den Build fehlzuschlagen, wenn solche Abhängigkeiten existieren. Gibt es eine Möglichkeit, Abhängigkeiten von neuen Java 8
Klassen / Methoden in der Build-Zeit zu erkennen?
Ich dachte über zwei mögliche Optionen nach, aber ich bin mir nicht sicher, ob einer von ihnen machbar ist:
lint4j
) Regeln. Nicht sicher, ob es möglich ist, Abhängigkeiten von Klassen / Methoden mit lint
zu erkennen
Sie können dafür das Animal Sniffer Maven Plugin verwenden. Sie können überprüfen, ob Ihr Code nur APIs von einer bestimmten Basislinie ("Signatur") verwendet. In Ihrem Fall würden Sie die Signatur org.codehaus.mojo.signature: java17: 1.0 verwenden.
Wie andere darauf hingewiesen haben, könnten Sie auch den Bootstrap-Klassenpfad einrichten, aber a) erfordert das Einrichten eines JDK 7 und b) macht den Build etwas komplexer, da Sie auf die JDK 7-Installation verweisen müssen. Animal Sniffer ist viel einfacher zu arbeiten mit meiner Erfahrung.
Tags und Links java maven java-8 lint retrolambda