#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:
На самом деле я столкнулся с очень похожей проблемой и решил ее немного другим способом.
-
Как описано в OP, убедитесь, что это свойство объявлено в pom.xml:
<properties>
...
<m2e.apt.activation>jdt_apt</m2e.apt.activation>
...
</properties> -
Очевидно, что плагин m2e-apt для eclipse должен быть установлен:https://marketplace.eclipse.org/content/m2e-apt
-
В pom.xml убедитесь, что mapstruct-processor и lombok находятся в области видимости.
-
И последнее, но не менее важное: мне пришлось настроить 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.