2015-04-01 18 views
7

Niedawno dowiedziałem się, że lombok.jar kończy się w naszym ostatecznym artefakcie, który nie powinien być konieczny. W moim rozumieniu lombok jest tylko na etapie kompilacji.Maven Scope dla Lombok (Compile vs. Provided)

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

Ale kiedy ustawiam go na zakres, dostaję dziwne zachowanie w testach jednostkowych. Następują awarie z ClassNotFoundExceptions, a następnie przy próbie rozstrzygnięcia, co należy rozumieć pod pojęciem ClassNotFoundExceptions, a następnie próbować rozstrzygnąć, co to jest zakres domyślny używany do lomboku.

Używam Oracle JDK zbudować 1.8.0_25-B17 na MacOSX 10.9

+0

cóż, być może trzeba będzie ustawić zakres do przetestowania. jak na twoje pytanie, zwykle ustawiam go na kompilację, ale tylko dlatego, że leniwym jest kłopotać się: p –

Odpowiedz

5

Zazwyczaj compile. provided dotyczy słoików, które są zwykle dostarczane z serwerem aplikacji, który będzie hostował aplikację. Jeśli nie chcesz słoik w końcowym wniosku, to może najlepiej użyć wtyczki maven zamiast słoik bezpośrednio: http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

+1

+1 dla wtyczki lombok, nie wiedziałem tego. Ale nadal nie jest dla mnie oczywiste, dlaczego pod warunkiem nie działa w tym przypadku. Powinien być dostępny podczas kompilacji i nie będzie już potrzebny w późniejszych fazach. – mkraemerx

+0

Aby być pewnym, musiałbym przynajmniej zobaczyć klasę "LongValidator", która jest zgłaszana jako brakująca i prawdopodobnie inne elementy w pom, ale najprawdopodobniej problem z 'provided' jest taki, że Lombok musi wykonywać swoją pracę, gdy kompilacja ma miejsce, lub w czasie wykonywania. Jeśli go nie uwzględnisz ani nie wygenerujesz kodu Lombok podczas kompilacji, twoja klasa będzie wyglądała tak, jakby nie była przetwarzana przez Lombok. – EmirCalabuch

+1

Aby wyjaśnić dalej: Lombok to nie tylko biblioteka, to procesor, który modyfikuje kod podczas kompilacji. Więc musisz go wykonać podczas kompilacji, jeśli przełączysz go na zakres 'provided', to nie stanie się to domyślnie (możesz zmusić maven do uruchomienia procesora lombok dodając' -Dexec.classpathScope = "compile" 'do linii poleceń.) – EmirCalabuch

23

Lombok powinien być stosowany w zakresie provided (patrz official docs).

Powodem (jak stwierdzono w komentarzach) jest to, że lombok jest narzędziem tylko do kompilacji. Oznacza to, że nie jest on potrzebny w środowisku wykonawczym w ogóle. Robiąc zakres provided, udostępniasz biblioteki lombok kompilatorowi, ale jest to zależność twojego skompilowanego słoika od , a nie. W związku z tym twój ostateczny słoik nie będzie zależał od Lombok i nie musi być włączony do żadnego wdrożenia, co zmniejsza zależności i rozmiar twoich narzędzi.

+2

Na marginesie, ponieważ może to być mylące dla wielu osób: maven scope 'compile' oznacza, że ​​jest dostępny w czasie kompilacji iw czasie wykonywania. Jeśli zasięg jest "podany", jest dostępny tylko w czasie kompilacji. Zobacz http://stackoverflow.com/questions/6646959 –

Powiązane problemy