Introduzione a Animal Sniffer Maven Plugin

1. Introduzione

Mentre si lavora in Java, a volte è necessario utilizzare più versioni linguistiche contemporaneamente.

È normale che il nostro programma Java sia compatibile in fase di compilazione con una versione di Java (ad esempio, Java 6), ma è necessario utilizzare una versione diversa (ad esempio, Java 8) nei nostri strumenti di sviluppo e una versione forse diversa per eseguire l'applicazione .

In questo rapido articolo, dimostreremo quanto sia facile aggiungere misure di salvaguardia dell'incompatibilità basate sulla versione di Java e come il plug-in Animal Sniffer può essere utilizzato per segnalare questi problemi in fase di compilazione controllando il nostro progetto con le firme generate in precedenza.

2. Impostazione di -source e -target del compilatore Java

Iniziamo con un progetto Hello World Maven, in cui stiamo utilizzando Java 7 sulla nostra macchina locale ma vorremmo distribuire il progetto nell'ambiente di produzione che utilizza ancora Java 6.

In questo caso, possiamo configurare il plug-in del compilatore Maven con i campi di origine e di destinazione che puntano a Java 6.

Il campo "origine" viene utilizzato per specificare la compatibilità con le modifiche al linguaggio Java e il campo "destinazione" viene utilizzato per specificare la compatibilità con le modifiche JVM.

Diamo ora un'occhiata alla configurazione del compilatore Maven di pom.xml:

  org.apache.maven.plugins maven-compiler-plugin 3.7.0  1.6 1.6   

Con Java 7 sulla nostra macchina locale e la stampa di codice Java "ciao mondo" sulla console, se andiamo avanti e creiamo questo progetto utilizzando Maven, verrà compilato e funzionerà correttamente su una scatola di produzione che esegue Java 6.

3. Presentazione delle incompatibilità API

Vediamo ora quanto è facile introdurre accidentalmente l'incompatibilità delle API.

Supponiamo di iniziare a lavorare su qualche nuovo requisito e di utilizzare alcune funzionalità API di Java 7 che non erano presenti in Java 6.

Diamo un'occhiata al codice sorgente aggiornato:

public static void main(String[] args) { System.out.println("Hello World!"); System.out.println(StandardCharsets.UTF_8.name()); }

java.nio.charset.StandardCharsets è stato introdotto in Java 7.

Se ora andiamo avanti ed eseguiamo la build di Maven, verrà comunque compilata correttamente ma fallirà in fase di esecuzione con errore di collegamento su una scatola di produzione con Java 6 installato.

La documentazione di Maven menziona questa trappola e consiglia di utilizzare il plug-in Animal Sniffer come una delle opzioni.

4. Reporting API Compatibilità

Il plug-in Animal Sniffer fornisce due funzionalità principali:

  1. Generazione delle firme del runtime Java
  2. Verifica di un progetto rispetto alle firme API

Modifichiamo ora il pom.xml per includere il plugin:

 org.codehaus.mojo animal-sniffer-maven-plugin 1.16   org.codehaus.mojo.signature java16 1.0     animal-sniffer verify  check    

Qui, la sezione di configurazione di Animal Sniffer fa riferimento a una firma di runtime Java 6 esistente. Inoltre, la sezione di esecuzione controlla e verifica il codice sorgente del progetto rispetto alla firma e ai flag specificati se vengono rilevati problemi.

Se andiamo avanti e creiamo il progetto Maven, la compilazione fallirà e il plugin segnalerà l'errore di verifica della firma come previsto:

[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.codehaus.mojo:animal-sniffer-maven-plugin:1.16:check (animal-sniffer) on project example-animal-sniffer-mvn-plugin: Signature errors found. Verify them and ignore them with the proper annotation if needed.

5. conclusione

In questo tutorial, abbiamo esplorato il plug-in Maven Animal Sniffer e come può essere utilizzato per segnalare eventuali incompatibilità relative all'API in fase di compilazione.

Come sempre, il codice sorgente completo è disponibile su GitHub.