Как правильно интегрировать MapStruct с Eclipse? (Включая java-агент Lombok)

#java #eclipse #lombok #mapstruct

#java #eclipse #ломбок #mapstruct

Вопрос:

Я готов использовать MapStruct в каком-нибудь официальном проекте, поэтому я решил сначала провести его тестирование; Мне нужно было бы заставить его работать интегрированным с eclipse и следовать всем инструкциям, предоставленным на веб-сайте MapStruct, но … пока безуспешно. Кто-нибудь добился успеха в такой интеграции? и если да , чего мне может не хватать?

Мой тест начался с чего-то большего, но когда я понял, что это не работает, я решил использовать меньший пример, и вот что я сделал:

  • Используя openjdk-10.0.1_windows-x64
  • загружена и установлена свежая версия eclipse (eclipse-jee-2019-03- R-win32-x86_64)
  • установлена последняя версия m2e-apt (и плагин mapstruct, хотя и не требуется для этого упражнения), как предложено вhttp://mapstruct.org/documentation/ide-support /
  • загружено https://github.com/mapstruct/mapstruct-examples
  • импортированный из git (из eclipse) проект mapstruct-clone (посмотрел базовый пример)
  • проверил настройки, предложенные вhttp://mapstruct.org/documentation/dev/reference/html (глава 2.1) и все выглядит хорошо

… нет способа убедить eclipse автоматически сгенерировать реализацию mapper, я даже добавил строку jdt_apt в pom.

Вот фрагмент pom.xml — пожалуйста, обратитесь к проекту mapstruct-clone для всего кода.

 <properties>
    <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
    <m2e.apt.activation>jdt_apt</m2e.apt.activation>
</properties>
  

Ожидаемый результат будет:

  • чтобы найти мои повторно сгенерированные классы в разделе «target / generated-sources / annotations», когда я сохраняю интерфейс сопоставления
  • (как указаноhttp://mapstruct.org/documentation/dev/reference/html » он настроит процессор аннотаций MapStruct таким образом, чтобы он запускался прямо в IDE всякий раз, когда вы сохраняете тип mapper. Здорово, не так ли?»)
  • но не
  • Я могу получить классы, созданные только с помощью «чистой установки mvn», что хорошо, но не так удобно

Важное редактирование: я также использую lombok javaagent

Комментарии:

1. Другой тест с «eclipse-jee-2018-12- R-win32-x86_64» также не удалось

2. Другой тест с «java-se-8u40-ri» (с обеими зависимостями <artifactId>mapstruct-jdk8</artifactId> и <artifactId>mapstruct</artifactId>) также показал

3. Обновление: я просмотрел журналы в eclipse, и это то, что у меня есть java.lang. Ошибка NoClassDefFoundError: org/mapstruct/ap/spi/AstModifyingAnnotationProcessor

4. Еще один совет, я также пользуюсь java-агентом lombok eclipse, который сам по себе выглядит проблемой ( github.com/mapstruct/mapstruct/issues/1159 )

Ответ №1:

В конце концов я нашел решение проблемы ( = D)

  • во-первых, спасибо Sjaak Derksen из команды MapStruct за поддержку
  • второе спасибо Павлу Хоралу за публикацию этого решенияhttps://github.com/mapstruct/mapstruct/issues/1159
  • и, наконец, спасибо себе за то, что я такой упрямый (ну, иногда это помогает)

Проблема действительно была связана с несовместимостью между Lombok java agent и MapStruct. Чтобы заставить это работать, просто сделайте то, что предложил Павел в своем последнем посте, и это сработает:

[…] просто удалите регистрацию SPI внутри lombok.jar (путем удаления META-INF/services/org.mapstruct.ap.spi.astm modifyingannotationprocessor) […]

Комментарии:

1. Mmm…it кажется, это не работает с lombok 1.18.12. Я попытался удалить этот класс из пакета, но ошибка все еще существует. Кроме того, если я просто использую 1.16.12, мне вообще не нужно удалять этот класс

Ответ №2:

На самом деле я столкнулся с очень похожей проблемой и решил ее немного другим способом.

  1. Как описано в OP, убедитесь, что это свойство объявлено в pom.xml:

    <properties>
    ...
    <m2e.apt.activation>jdt_apt</m2e.apt.activation>
    ...
    </properties>

  2. Очевидно, что плагин m2e-apt для eclipse должен быть установлен:https://marketplace.eclipse.org/content/m2e-apt

  3. В pom.xml убедитесь, что mapstruct-processor и lombok находятся в области видимости.

  4. И последнее, но не менее важное: мне пришлось настроить lombok.jar добавив org.mapstruct.ap.spi.AstModifyingAnnotationProcessor.class файл в jar (см. https://github.com/mapstruct/mapstruct/issues/1159#issuecomment-328974483).

Протестировано с Eclipse 2019-03, Lombok 1.18.6 и Mapstruct 1.2.0.Final.

Надеюсь, это поможет!

Комментарии:

1. Крис, все в порядке, если это работает, в любом случае, я обычно не чувствовал бы себя более комфортно, удаляя файл класса из jar.