Простой @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


Итак, вопросы:

  1. Конфигурация gradle неверна, поэтому запуск приложения через gradle завершается неудачно. Как исправить конфиг gradle?

  2. Xlint:cantFindType ошибки. Aop.xml не поднимается? Как решить это?

Мне еще не удалось найти простой пример spring-boot+gradle+ @Configurable, который использует aop.xml

1 ответ

Решение

Я решил проблему, и это довольно неловко.

  1. Это было связано с тем, что aop.xml не был поднят.
  2. Файл не был обнаружен, потому что он был в каталоге с именем META_INF/ на пути класса, а не META-INF/, Это довольно важное различие.

В любом случае, я обновил вопрос с минимальной конфигурацией, необходимой для получения @Configurable работа с современной пружинной загрузкой и настройкой gradle с переплетением времени загрузки для поддержки Lombok. Надеюсь, это будет кому-то полезно.

Другие вопросы по тегам