0

Is there documentation or an example that sets out how to successfully integrate MapStruct 1.3.1 with Eclipse 2020-03 and Gradle/Buildship and that describes what needs to be done to generate the MapStruct implementation classes? I've done a fair bit of searching and reading but can't seem to nail it having tried a quite a number of things.

My project setup is that of a Gradle multi-project setup and it worked fine until I tried adding MapStruct via Gradle. I have JAX-RS REST classes with annotations in my project and the issue(s) I see seem to be related to annotation processing in some way as the build fails with compilation errors for the annotations in the REST classes (please see the exception output below).

Any pointers, further reading, fixes are welcome and hugely appreciated.

The exception I get when I run the relevant build task from within Eclipse's Gradle Tasks view is:

D:\<placeholder>\PlanContractualDetails.java:527: error: cannot find symbol
  @ApiModelProperty(example = "null", required = true, value = "True - life time investment option phasing applicable. Please note that this value will be always populated by using the active LTIO on the plan, irrespective of the effectiveDate passed by the caller.")
   ^
  symbol:   class ApiModelProperty
  location: class PlanContractualDetails
100 errors

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':epsilon-plan-service:compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 563ms
1 actionable task: 1 executed

My build.gradle is as follows:

/*
 * Project build file.
 */

 /* Plugin configuration */
plugins {
    id 'java'
    id 'war'
    id 'eclipse-wtp'
}

sourceCompatibility = JavaVersion.VERSION_1_8
/* Project dependencies */
dependencies { 

    compile "org.mapstruct:mapstruct-jdk8:${mapstructVersion}"
    testCompile 'org.testng:testng:6.10', 'org.easytesting:fest-assert:1.4'
    compile "org.mapstruct:mapstruct-processor:${mapstructVersion}"

    compile "javax.ws.rs:javax.ws.rs-api:2.0.1"
    providedCompile "javax.servlet:javax.servlet-api:3.1.0" 

    // --- Mapstruct ---------------------------------
    // https://mvnrepository.com/artifact/org.mapstruct/mapstruct-jdk8
     //compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.3.1.Final'
    // https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor
    //compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.3.1.Final'
    //compile "org.mapstruct:mapstruct:${mapstructVersion}"

    // If you are using mapstruct in test code
    //testAnnotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
    //compileOnly("org.mapstruct:mapstruct-jdk8:${mapstructVersion}")
    //annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"

    //compileOnly "javax:javaee-api:${javaee_api_version}"
}

tasks.withType(JavaCompile) {
    options.compilerArgs = [
            '-Amapstruct.suppressGeneratorTimestamp=true'
    ]
}

sourceSets.main.java.srcDirs += 'src'
//sourceSets.main.kotlin.srcDirs += myDir

/* Eclipse configuration */
ext.outputDir = 'src/main/webapp/WEB-INF/classes'
eclipse {
/*
    project {
        natures 'org.eclipse.buildship.core.gradleprojectnature'

        //buildCommands.clear();
        //buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
    }
*/
    classpath {
        defaultOutputDir = file("${outputDir}")
        file.whenMerged {
            entries.each {
                source ->
                    // This seems kludgy.
                    if (source.kind == 'src' && source.toString().contains('output=') && source.output.contains("${eclipse_default_output_dir}")) {
                        source.output = "${outputDir}"
                    }
            }
        }
    }

    /* 

        Deal with project facets.
        See: https://stackoverflow.com/questions/48828869/how-to-convert-java-gradle-project-to-dynamic-web-project
        And: https://discuss.gradle.org/t/easily-customize-the-eclipse-wtp-facet-version/8690
        And: https://github.com/gradle/gradle/issues/1334
    */
  wtp {
    facet {
      file {
        withXml {
            /* 
                Ensure that the Eclipse facet metadata in the file .settings/org.eclipse.wst.common.project.facet.core.xml
                is preserved after running this build script. This is needed as Gradle overwrites this file and defaults 
                some of the entries to older versions which may result in both Eclipse metadata and Gradle build errors.                    
            */
            def node = it.asNode()
            /*
                This runtime facet is specifically for Eclipse projects such as a Dynamic Web Project project created 
                for development, deployment and debugging on WebSphere Application Server traditional V9.0.

                The name: must correspond to the name Properties -> Project Facets -> Runtimes tab entry 
                that is ticked for this Eclipse project.
            */
                node.appendNode('runtime', [name: 'WebSphere Application Server traditional V9.0'])
            }
            def oldJstWebFacet = facets.findAll {
                it.name == 'jst.web' && it.version == '2.4'
            }
            facets.removeAll(oldJstWebFacet)
            facet name: 'jst.web', version: '3.1'

            /*
                Additional Eclipse project facets for WebSphere 9 traditional.
            */
            facet name: 'com.ibm.websphere.coexistence.web', version: '9.0'
            facet name: 'com.ibm.websphere.extended.web', version: '9.0'

            //facet name: 'java', version: '1.8'         
      }
    }
  }
}

test {
    useTestNG()
}```


Zain Tofie
  • 43
  • 6
  • Did you checkout the examples in the example repo: and the MapStruct documentation? See: https://github.com/mapstruct/mapstruct-examples and https://mapstruct.org/documentation/stable/reference/html/#_gradle – Sjaak Apr 04 '20 at 15:31
  • Thanks yes I tried both those. – Zain Tofie Apr 04 '20 at 19:05

1 Answers1

1

My issue turned out to not be a MapStruct issue nor was it related to annotation processing. I did everything again from scratch but before generating any JAX-RS or MapStruct code, tested the MapStruct Gradle config and it ran through. Then added some MapStruct example code and it was still happy; Adding the JAX-RS bindings caused the build to fail though. The fix was to add the correct JAX-RS dependencies and to rebuild the Eclipse metadata by running the Eclipse clean and build tasks.

Zain Tofie
  • 43
  • 6