【问题标题】:MapStruct with Gradle and eclipse is not working带有 Gradle 和 Eclipse 的 MapStruct 无法正常工作
【发布时间】:2019-02-22 20:26:43
【问题描述】:

使用 SpringBoot 和 MapStruct 创建 gradle 应用程序。

Build.gradle 文件有以下条目。

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}"
}

plugins {
    id 'java'
    id 'net.ltgt.apt-eclipse' version '0.18'
}

映射器类

@Mapper(componentModel="spring")
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);

    @Mapping(source = "qax", target = "baz")
    @Mapping(source = "baz", target = "qax")
    Target sourceToTarget(Source source);

    @InheritInverseConfiguration
    Source targetToSource(Target target);
}

Impl 文件在 build 文件夹下创建,但在运行代码时出现错误:

org.mapstruct.example.app.main(app.java:7) 的线程“main”java.lang.ExceptionInInitializerError 中的异常原因: java.lang.RuntimeException:java.lang.ClassNotFoundException:不能 在以下位置找到 org.mapstruct.example.SourceTargetMapper 的实现 org.mapstruct.factory.Mappers.getMapper(Mappers.java:68) 在 org.mapstruct.example.SourceTargetMapper.(SourceTargetMapper.java:29) ... 1 更多原因:java.lang.ClassNotFoundException:找不到 org.mapstruct.example.SourceTargetMapper 的实现在 org.mapstruct.factory.Mappers.getMapper(Mappers.java:85) 在 org.mapstruct.factory.Mappers.getMapper(Mappers.java:65)

如果我从 Build 文件夹 bin 文件夹中移动 Impl 文件,它工作正常。这意味着 MapStruct 在 build 文件夹下创建实现文件并尝试从 bin 文件夹访问它。

如何将构建文件的位置更改为bin文件夹?

使用 M2e 插件的 Maven 项目可以正常工作,但不能使用 gradle。

建议更改后的 Build.gradle 文件。

    plugins {
    id 'java'
    id 'net.ltgt.apt-eclipse' version '0.18'
}

repositories {
    mavenCentral()
    mavenLocal()
}

task wrapper(type: Wrapper) { gradleVersion = '3.4' }

ext {
    mapstructVersion = "1.2.0.Final"
    javaLanguageLevel = '1.8'
    generatedMapperSourcesDir = "${buildDir}/generated-src/mapstruct/main"
}

sourceCompatibility = rootProject.javaLanguageLevel

sourceSets.main {
    ext.originalJavaSrcDirs = java.srcDirs
    java.srcDir "${generatedMapperSourcesDir}"
}

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

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

测试 { useTestNG() }

但仍然无法正常工作。请检查缺少的内容。

【问题讨论】:

  • 我在构建文件中看不到任何 spring-boot 依赖项。你能告诉你如何构建和运行应用程序吗?你也可以发布你的主要课程吗?
  • an interface 可能无法保留实例;与abstract class相对。
  • 这是怎么解决的?

标签: java eclipse spring-boot gradle mapstruct


【解决方案1】:

看起来生成的源代码没有自动包含在应用程序的类路径中。

试一试the sample on github,它工作正常。

为您的应用程序使用相同的gradle config as the sample

【讨论】:

  • 感谢您的快速回复。实际上,我是java新手。您能否建议 ${buildDir}/generated-src/mapstruct/main 中“buildDir”的值是多少?以及如何为生成的文件指定 bin 文件夹的路径?
  • ${buildDir} 是 gradle 已知的,您不必指定它。
  • 我在描述中添加了更新的 gradle.build。请看一看。它仍然无法正常工作并出现相同的错误。
  • 看起来文档可能适用于旧版本的 mapStruct。在 github 上尝试了这个例子,对我来说效果很好:github.com/mapstruct/mapstruct-examples/blob/master/…
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2014-11-20
  • 1970-01-01
  • 2020-06-15
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多