Quando utilizzare MojoExecutionException vs MojoFailureException in Maven
-
06-07-2019 - |
Domanda
Il metodo execute di AbstractMavenMojo dichiara che genera due eccezioni, MojoExecutionException e MojoFailureException. Il lancio di entrambi provoca l'arresto della compilazione e il registro visualizza un quasi messaggio identico in ciascun caso.
Il messaggio per MojoExecutionException è:
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] [exception text]
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
e il messaggio per MojoFailureException è:
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] [exception text]
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
Quando dovresti lanciare quale eccezione e perché?
Soluzione
Sembra che dovresti lanciare un MojoExecutionException
se il problema rende impossibile continuare con la compilazione e usare MojoFailureException
in caso contrario.
Puoi controllare il comportamento per la consegna di MojoFailureExpections
quando viene eseguito Maven.
Il seguente collegamento descrive in dettaglio la differenza: https://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html#writing-plugins-sect-failure
Collegamento non funzionante? ricerca Google
sonatype writing-plugins-sect-custom-plugin writing-plugins-sect-failure
Altri suggerimenti
Lancia un MavenFailureException
se il tuo passo di compilazione fallisce ma potrebbe essere ignorato (ad esempio potresti voler ignorare i test falliti).
Lancia un MavenExecutionException
se non c'è modo di continuare - supponi di aver rilevato una condizione irrecuperabile come quella che stavi cercando di compilare e che il progetto non potesse essere compilato, quindi tutto ciò dopo sarebbe comunque inutile.
MavenExecutionException
ucciderà sempre la build mentre il comportamento di MavenFailureException
è configurabile.
Il comportamento predefinito è quello di fallire velocemente, ovvero lo stesso comportamento dell'errore di compilazione, che è spesso quello che vuoi. Puoi modificare il comportamento passando un flag della riga di comando:
mvn -fae
ha esito negativo alla fine, vale a dire che ogni fase di compilazione verrà eseguita e potresti riscontrare fallimenti successivi in ??caso di errore di una fase, l'intera generazione viene interrotta solo una volta eseguita ogni fase.
mvn -fn
non fallisce. Ciò è utile se si desidera ignorare, ad esempio, un test di integrazione non riuscito, ma mvn deploy
.