19

I am using Mapstruct and Lombok with maven and IDEA and it is refusing to generate mappers implementation. Config:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
...

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <java.version>11</java.version>
        <org.mapstruct.version>1.3.0.Beta2</org.mapstruct.version>
        <lombok.version>1.18.2</lombok.version>
    </properties>

    <dependencies>
        <!-- spring deps -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        ...

        <!-- lombok dep -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.build.directory}/generated-sources/java/</source>
                                <source>${project.build.directory}/generated-sources/annotations/</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Implementation-Version>${project.version}</Implementation-Version>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

   ...
</project>

Both Mapstruct and Lombok are registered as annotations processors with idea: enter image description here

Implementation files does not generate when I try to build with IDEA or if I try maven clean install.

I have tried changing Java from 11 to 8 and it still does not work. /target/generated-sources/annotations is just empty. Other project with same config is wroking fine.

2
  • Does it work when you run it only with maven? Which version of IntelliJ are you using? Commented Jan 31, 2019 at 18:44
  • could it be that build-helper-maven-plugin conflicts with generating resources? Could you comment that one out and see what happens? Commented Jan 31, 2019 at 19:13

8 Answers 8

13

Adding mapstruct-processor dependency solved the issue for me.

Sign up to request clarification or add additional context in comments.

1 Comment

Adding the gradle dependency which worked for me. implementation 'org.mapstruct:mapstruct-processor:1.0.0.Beta3' Note - Its terrible that I can’t format comment in stackoverflow
7

Problem was that my mappers were missing annotation @Mapper.

Comments

7

If you use kotlin, you need to use kapt instead of annotationProcessor

Gradle example:

plugins {
  kotlin("kapt") version "1.4.32"
}
...
dependencies {
  ...
  implementation("org.mapstruct:mapstruct:1.4.2.Final")
  kapt("org.mapstruct:mapstruct-processor:1.4.2.Final")
}

Afterwards the implementation is generated if you execute gradle build

2 Comments

adding kotlin("kapt") version "1.4.32" in plugins {} block results in error saying "only id(String) method calls allowed in plugins {} script block"
OMG thank you for this comment. I spent to much time to fix it. If you using gradle and kotlin plugins { id "org.jetbrains.kotlin.kapt" version '' } dependencies { kapt 'org.mapstruct:mapstruct-processor:'}
2

For me the problem was:

<useIncrementalCompilation>false</useIncrementalCompilation>

After commented that out, all works!

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>${jdk.target.version}</source>
        <target>${jdk.target.version}</target>
        <!--<useIncrementalCompilation>false</useIncrementalCompilation>-->
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${org.mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

3 Comments

Mattia, this does not look like an answer for OP question. As you can see useIncrementalCompilation was not used.
You are right! I just wanted to share my solution in case someone has the same kind of problem as me. I think it might be useful for some people.
@MattiaCasella I'm glad you left this here. It is a solution to the problem why Mapstruct was not generating the implementation class for the Mapper. The solution as shown in your answer was to add it to the annotation processor path
1

If you are using Kotlin with maven, you can add these dependencies:

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.4.2.Final</version>
    </dependency>

And add the kapt execution to the kotlin-maven-plugin as follows:

   <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>1.5.0</version>
                <executions>
                    <execution>
                        <id>kapt</id>
                        <goals>
                            <goal>kapt</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>src/main/kotlin</sourceDir>
                                <sourceDir>src/main/java</sourceDir>
                            </sourceDirs>
                            <annotationProcessorPaths>
                                <!-- Specify your annotation processors here. -->
                                <annotationProcessorPath>
                                    <groupId>com.google.dagger</groupId>
                                    <artifactId>dagger-compiler</artifactId>
                                    <version>2.9</version>
                                </annotationProcessorPath>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Comments

1

Try Properties > Maven > Annotation Processing > (Enable) Automatically configure JDT APT.

Comments

0

I have come across this issue. In my case gets this error:

Java: No implementation was created for Mapper due to having a problem in the erroneous element

when the app is running.

I used to spring boot version 2.4.3 when I decrease version to 2.2.6.RELEASE it start to work

Comments

0

I've tried everything here but nothing worked so I copied the pom.xml which is actually working there I found that we have to add this configuration after build tag. Then compile and it will generate Mapper Impl class in target folder

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        </repository>
</repositories>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.