2016-06-27 17 views
0

Ich habe Frühlings-Boot-Anwendung mit den nächsten Plugins und Abhängigkeiten:Lombok funktioniert nicht mit Feder-boot-Maven-Plugin

<!--...--> 
<dependency> 
    <groupId>org.springframework.security.oauth</groupId> 
    <artifactId>spring-security-oauth2</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency> 


    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.16.8</version> 
     <scope>provided</scope> 
    </dependency> 

<!--...--> 

<build> 
     <finalName>service-api</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>attached</goal> 
         </goals> 
         <configuration> 
          <descriptors> 
           <descriptor>service-api.xml</descriptor> 
          </descriptors> 
          <appendAssemblyId>false</appendAssemblyId> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>com.alexecollins.docker</groupId> 
       <artifactId>docker-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

und der Text 2 Klassen für Prüfung lombok in meiner App:

import lombok.Data; 

@Data 
public class TestDto { 

    private String testStr; 
} 

Und

public class TestCall { 

     public void testLombok() { 
      TestDto dto = new TestDto(); 

      dto.setTestStr("My Test String."); 

      System.out.println(dto); 
     } 

    } 
So

, wenn ich feder Boot laufen: run vom Plugin oder sogar einem einfachen Befehl mvn kompilieren, habe ich den nächsten Fehler:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project service-api: Compilation failure: Compilation failure: [ERROR] D:\Projects\??????\service-api\src\main\java\TestCall.java:[7,-1] [ERROR] 1. ERROR in D:\Projects\???????\service-api\src\main\java\TestCall.java (at line 7) [ERROR] dto.setTestStr("My Test String."); [ERROR] ^^^^^^^^^^ [ERROR] The method setTestStr(String) is undefined for the type TestDto [ERROR] ---------- [ERROR] 1 problem (1 error) [ERROR] [ERROR] Found 1 error and 0 warnings.

Es scheint, die lombok Features nicht Arbeiten an spting Plugin. Wenn ich jedoch einen Standard Maven-Compiler-Plugin (Version 3.5.1) verwenden, funktioniert alles korrekt. Aber für den Moment möchten wir Spring-Boot-Embedded-Container verwenden und sind nicht bereit, unseren Build-Workflow zu ändern. Ist es möglich, etwas mit diesem Problem zu tun? Kann ich einige spezielle Abhängigkeiten oder etwas ähnliches einschließen?

+3

generiert ein neues Boot (Web + Lombok) Maven-Projekt über http://start.spring.io und legte eine einfache Lombok Datenklasse in es und es funktioniert gut. https://gist.github.com/zapl/1d238b278b8cc68e330e4bf1048943a8 ist die generierte Pom (unberührt) und die Java-Quelle (hinzugefügt die Datenklasse), "Spring-Boot: Run" druckt "Hallo" wie erwartet. – zapl

+1

Das Problem ist, dass ich einen Elternpom mit Groovy-Eclipse-Compiler-Plugin habe. So fand ich, wie es für Lombok in diesem Thema konfiguriert werden sollte: http://stackoverflow.com/questions/8524891/maven-groovy-and-java-lombok – eGoLai

Antwort

1

Das Problem in der Mutter pom war, die das nächste Plugin enthält:

<pluginManagement> 
      <plugins> 
       <plugin> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <configuration> 
         <compilerId>groovy-eclipse-compiler</compilerId> 
        </configuration> 
        <dependencies> 
         <dependency> 
          <groupId>org.codehaus.groovy</groupId> 
          <artifactId>groovy-eclipse-compiler</artifactId> 
          <version>2.9.2-01</version> 
         </dependency> 
         <dependency> 
          <groupId>org.codehaus.groovy</groupId> 
          <artifactId>groovy-eclipse-batch</artifactId> 
          <version>2.4.3-01</version> 
         </dependency> 
        </dependencies> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

So fand ich die Lösung hier: Maven Groovy and Java + Lombok

und jetzt meine groovy-Eclipse-Compiler-Plugin ist:

<pluginManagement> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <compilerId>groovy-eclipse-compiler</compilerId> 
        <verbose>true</verbose> 
        <fork>true</fork> 
        <compilerArguments> 
         <javaAgentClass>lombok.launch.Agent</javaAgentClass> 
        </compilerArguments> 
       </configuration> 
       <dependencies> 
        <dependency> 
         <groupId>org.codehaus.groovy</groupId> 
         <artifactId>groovy-eclipse-compiler</artifactId> 
         <version>2.9.2-01</version> 
        </dependency> 
        <dependency> 
         <groupId>org.codehaus.groovy</groupId> 
         <artifactId>groovy-eclipse-batch</artifactId> 
         <version>2.4.3-01</version> 
        </dependency> 
        <dependency> 
         <groupId>org.projectlombok</groupId> 
         <artifactId>lombok</artifactId> 
         <version>1.16.8</version> 
        </dependency> 
       </dependencies> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
0

Da Lombok einen Standardcode generiert, so dass Sie dies nicht tun müssen, muss es eine Möglichkeit geben, diese Generation zu initialisieren. Im Falle Ihrer IDE haben Sie ein Plugin, das das tun wird. Doch für ein Maven bauen Sie einen Build-Schritt erfordert, dass Maven, dass der relevante Code teilt sollte (im Build-Bereich) erzeugt werden:

<plugin> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok-maven-plugin</artifactId> 
    <version>1.16.8.0</version> 
    <executions> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>delombok</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Weitere Einzelheiten finden Sie in der documentation of the plugin überprüfen.

+1

Das Plugin ist nicht erforderlich, wenn Sie einen Compiler verwenden, der den JSR 269 unterstützt Pluggable Annotation Processing API. Was ist der Standard Weg, um Lombok zu verwenden. – Magnus

+0

Dieses Plugin wird zum Generieren von erweiterten Quellen benötigt. Ich denke, das Hinzufügen einer vorläufig generierten Quellen ist eine schlechte Idee. Wie es auf der offiziellen Website heißt, brauche ich nur eine Lomok-Lib im Klassenpass während der Erstellung des Projekts: https://projectlombok.org/mavenrepo/index.html – eGoLai