Простой @Configurable с современной пружинной загрузкой + Gradle
Моя цель - получить чистую настройку aspectj+spring aop, чтобы я мог использовать @Configurable для одного класса. Еще одно ограничение заключается в том, что он должен использовать время загрузки, поскольку Lombok не работает с CTW.
Хорошие новости: у меня это работает!
Плохая новость: консоль залита [Xlint:cantFindType]
ошибки. Смотрите раздел результатов ниже.
Окружающая среда
У меня есть один класс с пометкой @Configurable
, Это класс, используемый и созданный Джексоном, отсюда и необходимость в АОП. Это не очень интересно, поэтому я не буду показывать это здесь. Это просто обычный класс с единственной аннотацией Configurable и @Autowired
боб внутри.
SpringBootApplication
Мой класс приложения имеет обычные аннотации:
@SpringBootApplication
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class MyApplication {
build.gradle
В моем build.gradle есть все обычные подозреваемые. Образец:
configurations {
springinstrument
}
dependencies {
compile('org.projectlombok:lombok')
compile('org.springframework.boot:spring-boot-starter-aop')
compile("org.springframework.boot:spring-boot-starter-data-rest")
compile('org.springframework.data:spring-data-rest-hal-browser')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-devtools')
compile('org.springframework.plugin:spring-plugin:1.2.0.RELEASE')
..snip..
runtime('org.springframework:spring-instrument:4.+')
springinstrument "org.springframework:spring-instrument:4.+"
runtime configurations.springinstrument.dependencies
}
test.doFirst {
jvmArgs "-javaagent:${configurations.springinstrument.asPath}"
}
JVM Args
Я запускаю тест JUnit со следующими аргументами (через конфигурацию запуска Intellij)
-ea
-javaagent:/Users/me/.gradle/caches/modules-2/files-2.1/org.springframework/spring-instrument/4.3.3.RELEASE/5db399fa5546172b9c107817b4abaae6b379bb8c/spring-instrument-4.3.3.RELEASE.jar
aop.xml
у меня есть src/main/resources/META-INF/aop.xml
содержащий:
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-Xreweavable -showWeaveInfo">
<!-- only weave classes with @Configurable interface -->
<include within="@org.springframework.beans.factory.annotation.Configurable */>
</weaver>
</aspectj>
Однако я подозреваю, что этот файл не берется. Неважно, что я положил в файл, результаты всегда одинаковы. Даже если я поставлю случайный недействительный XML.
Тест
Тест junit - это простой тест сериализации-десериализации Джексона с использованием @Configurable
аннотированный класс.
Тестовый класс имеет аннотации:
@SpringBootTest
@RunWith(SpringRunner.class)
Результаты, достижения
При запуске теста Junit через Intellij -> Это работает, но..
LTW действительно работает, и мой тест проходит при запуске через Intellij с аргументами jvm выше.
Однако время загрузки приложения значительно больше, и журнал заполняется Xlint:cantFindType
ошибки
Пример:
2016-11-07 19:28:21.944 INFO 45213 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
[AppClassLoader@18b4aac2] error can't determine implemented interfaces of missing type org.springframework.security.ldap.authentication.LdapAuthenticationProvider
when weaving type org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer
when weaving classes
when weaving
[Xlint:cantFindType]
[AppClassLoader@18b4aac2] error can't determine implemented interfaces of missing type io.undertow.server.handlers.accesslog.AccessLogHandler
when weaving type org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory
when weaving classes
when weaving
[Xlint:cantFindType]
[AppClassLoader@18b4aac2] error can't determine implemented interfaces of missing type io.undertow.server.handlers.accesslog.AccessLogHandler
when weaving type org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory
when weaving classes
when weaving
[Xlint:cantFindType]
[AppClassLoader@18b4aac2] error can't determine implemented interfaces of missing type io.undertow.server.handlers.accesslog.AccessLogHandler
when weaving type org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory
when weaving classes
when weaving
[Xlint:cantFindType]
.. many more.. all in the org.springframework.boot package
При запуске теста через командную строку gradle -> работает, вроде.
Когда я запускаю тест с gradle test --tests *MyTestClass
, тест не пройден из-за NullPointerException на.. угадайте, что, @Autowired
боб Я ожидаю, что будет введен автоматически.
Я понял, что это работает с конфигурацией Gradle Test, хазз! Я обновил конфигурацию выше. Но.. это страдает от той же проблемы, что и запуск его в моей IDE: the Xlint:cantFindType
Итак, вопросы:
Конфигурация gradle неверна, поэтому запуск приложения через gradle завершается неудачно. Как исправить конфиг gradle?Xlint:cantFindType
ошибки. Aop.xml не поднимается? Как решить это?
Мне еще не удалось найти простой пример spring-boot+gradle+ @Configurable, который использует aop.xml
1 ответ
Я решил проблему, и это довольно неловко.
- Это было связано с тем, что
aop.xml
не был поднят. - Файл не был обнаружен, потому что он был в каталоге с именем
META_INF/
на пути класса, а неMETA-INF/
, Это довольно важное различие.
В любом случае, я обновил вопрос с минимальной конфигурацией, необходимой для получения @Configurable
работа с современной пружинной загрузкой и настройкой gradle с переплетением времени загрузки для поддержки Lombok. Надеюсь, это будет кому-то полезно.