2015-04-01 12 views
7

Ich habe kürzlich herausgefunden, dass das lombok.jar in unserem endgültigen Artefakt endet, was nicht notwendig sein sollte. In meinem Verständnis ist Lombok nur Kompilierzeit.Maven Umfang für Lombok (Kompilieren vs. Bereitgestellt)

Aber wenn ich es auf Umfang zur Verfügung gestellt, bekomme ich seltsames Verhalten in Komponententests. Sie stürzt mit ClassNotFoundExceptions dann, wenn

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

zu lösen versucht Welchen Umfang Maven im Allgemeinen verwendet für lombok?

Ich bin mit Oracle JDK 1.8.0_25-b17 auf MacOSX 10.9

+0

Nun müssen Sie möglicherweise den zu testenden Bereich festlegen. wie für Ihre Frage, ich setze es normalerweise zu kompilieren, aber nur weil ich zu faul bin, mich damit zu beschäftigen: p –

Antwort

5

Normalerweise compile bauen. provided ist für JAR-Dateien vorgesehen, die normalerweise mit dem Anwendungsserver geliefert werden, der die Anwendung hosten wird. Wenn Sie nicht das Glas in der Endanwendung wollen, ist es vielleicht am besten, das Maven Plugin zu verwenden, anstatt das Glas direkt: http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

+1

+1 für das Lombok-Plugin, wusste das nicht. Aber trotzdem ist mir nicht klar, warum das in diesem Fall nicht funktioniert. Es sollte während der Kompilierzeit verfügbar sein und in späteren Phasen nicht mehr benötigt werden. – mkraemerx

+0

Um sicher zu gehen, müsste ich zumindest die 'LongValidator'-Klasse sehen, die als vermisst gemeldet wird und wahrscheinlich andere Elemente in der Pom, aber höchstwahrscheinlich das Problem mit' vorgesehen' ist, dass Lombok seine Arbeit ausführen muss, wenn die Kompilierung stattfindet, oder in der Laufzeit. Wenn Sie den Lombok-Code beim Kompilieren nicht angeben, wird Ihre Klasse so aussehen, als ob sie nicht von Lombok verarbeitet wurde. – EmirCalabuch

+1

Um weiter zu klären: Lombok ist nicht nur eine Bibliothek, es ist ein Prozessor, der den Code ändert, wenn die Kompilierung stattfindet. Sie müssen es also beim Kompilieren ausführen, wenn Sie es in den 'bereitgestellten 'Bereich schalten, wird dies standardmäßig nicht passieren (Sie können Maven zwingen, den Lombok-Prozessor auszuführen, indem Sie' -Dexec.classpathScope = "compile" 'zur Befehlszeile hinzufügen.) – EmirCalabuch

23

Lombok sollten am provided Umfang verwendet werden (siehe die official docs).

Der Grund (wie in den Kommentaren angegeben wurde) ist, dass Lombok ein Compile-Time-Only-Tool ist. Das heißt, es wird zur Laufzeit überhaupt nicht benötigt. Wenn Sie den Gültigkeitsbereich provided erstellen, stellen Sie dem Compiler die Lombok-Bibliotheken zur Verfügung, aber es ist nicht eine Abhängigkeit von Ihrem kompilierten Jar. Daher hängt Ihr endgültiges JAR nicht von Lombok ab und muss nicht in einer Bereitstellung enthalten sein, wodurch die Abhängigkeiten und die Größe Ihrer Bereitstellungsdateien reduziert werden.

+2

Als eine Randnotiz, weil dies für viele Leute verwirrend sein könnte: maven scope 'compile' bedeutet, dass es zur Kompilierzeit und zur Laufzeit verfügbar ist. Wenn der Bereich "bereitgestellt" ist, ist er nur zur Kompilierzeit verfügbar. Siehe http://stackoverflow.com/questions/6646959 –