2015-04-01 5 views
7

Recentemente ho scoperto che il lombok.jar finisce nel nostro artefatto finale, che non dovrebbe essere necessario. Nella mia comprensione, lombok è solo in fase di compilazione.Maven Scope per Lombok (Compile vs. fornito)

 <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <version>1.14.4</version> 
     </dependency> 

Ma quando l'ho impostato sullo scope fornito, ottengo uno strano comportamento nei test unitari. Si infrangono con ClassNotFoundExceptions poi quando si cerca di risolvere

java.lang.NoClassDefFoundError: com/svv/esp/serviceimpl/dataimport/common/validation/LongValidator 

Quale Maven portata è in generale utilizzato per Lombok?

che sto utilizzando Oracle JDK 1.8.0_25 costruire-B17 su MacOSX 10.9

+0

bene, potrebbe essere necessario impostare l'ambito per testare. per quanto riguarda la tua domanda, di solito la faccio compilare ma solo perché sono pigro a dargli fastidio: p –

risposta

5

solito compile. provided è per i vasi che di solito vengono forniti con il server delle applicazioni che ospiterà l'applicazione. Se non si desidera che il vaso nell'applicazione finale, è forse meglio usare il plugin Maven, piuttosto che il vaso direttamente: http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

+1

+1 per il plugin lombok, non lo sapevo. Ma ancora, non è ovvio per me perché fornito non funziona in questo caso. Dovrebbe essere disponibile durante la compilazione e non essere più necessario nelle fasi successive. – mkraemerx

+0

Per essere certi avrei almeno bisogno di vedere la classe 'LongValidator' che è stata segnalata mancante e probabilmente altri elementi nel pom, ma molto probabilmente il problema con' provided' è che Lombok deve eseguire il suo lavoro quando la compilazione avviene, o in runtime. Se non lo includi né genera il codice Lombok durante la compilazione, la tua classe sarà come se non fosse stata elaborata da Lombok. – EmirCalabuch

+1

Per chiarire ulteriormente: Lombok non è solo una libreria, è un processore che modifica il codice quando avviene la compilazione. Quindi è necessario eseguirlo durante la compilazione, se lo si commuta nello scope 'provided' questo non avverrà di default (si può forzare Maven ad eseguire il processore lombok aggiungendo' -Dexec.classpathScope = "compile" 'alla riga di comando. – EmirCalabuch

23

Lombok deve essere utilizzato in ambito provided (vedi la official docs).

Il motivo (come è stato affermato nei commenti) è che lombok è uno strumento solo in fase di compilazione. Cioè, non è necessario in fase di esecuzione per tutto. Rendendo lo scope provided, si rendono disponibili le librerie lombok al compilatore ma è non una dipendenza del contenitore compilato. Pertanto, il tuo jar finale non dipenderà da Lombok e non dovrà essere incluso in alcuna distribuzione, il che riduce le dipendenze e la dimensione dei tuoi deployable.

+2

Come nota a margine, questo potrebbe creare confusione per molte persone: maven scope 'compile' significa che è disponibile in fase di compilazione e in fase di esecuzione. Se scope è 'provided' è disponibile solo in fase di compilazione. Vedi http://stackoverflow.com/questions/6646959 –