Spring-Boot 2 AspectJ Сокращение времени загрузки

Я экспериментирую с Spring Boot 2 и AspectJ Load Time Weaving. Я могу запускать как тесты, так и приложение из Eclipse (добавьте два агента: aspectjweaver и spring-instrument на виртуальную машину), surefire из Maven также работает нормально, однако я не могу добавить два агента в spring-boot-maven-plugin.

Вот мой фрагмент pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>
            -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
            -javaagent:"${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar"
            -Dspring.profiles.active=test</argLine>
    </configuration>
</plugin>
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <agent>
            ${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
        </agent>
        <agent>
            ${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar
       </agent>
    </configuration>
</plugin>

Похоже, что spring-boot-maven-plugin только подключает spring-instrument к виртуальной машине. (На самом деле, всегда последняя запись «агент» в файле pom.

У кого-нибудь есть идея, как заставить это работать?

Я использую Java 8, Spring Boot 2.1.0.RELEASE (AspectJ 1.9.2 и Spring 5.1.2.RELEASE).


person TeeBea    schedule 09.12.2018    source источник


Ответы (1)


Согласно плагину документации, параметр agent представляет собой массив файлов, т.е. должен быть способ указать несколько файлов. Глядя на исходный код, я также вижу, что если на самом деле указано несколько агентов, все они добавляются в список параметров командной строки.

Теперь остается открытым вопрос, как указать несколько агентов? Обычно в плагинах Maven, если есть элемент массива, имя представляет собой что-то с множественным числом «s», например «агенты», и внутри вы должны использовать единственное число «агент» для элементов. Но здесь элемент массива — это уже слово в единственном числе.

Почему команда Spring не сделала этого здесь, я понятия не имею. Но когда я экспериментировал с параметром Maven -X и проверял вывод отладки, я увидел, что какие бы вложенные теги вы ни использовали, они работают. Вы можете использовать любой из

<agent>
    <agen>foo</agen>
    <agen>bar</agen>
</agent>
<agent>
    <x>foo</x>
    <y>bar</y>
</agent>
<agent>
    <agentElement>foo</agentElement>
    <agentElement>bar</agentElement>
</agent>

Из-за отсутствия лучшего соглашения я рекомендую последнее. В любом случае, простое повторение двух тегов agent верхнего уровня не решит проблему.

Что я не проверял из-за отсутствия полного проекта, так это то, действительно ли два агента в командной строке правильно запускают Spring Boot. Эта часть зависит от вас.

Обновление: я только что поднял соответствующую проблему Spring Boot # 15455.

Обновление 2: проблема Spring Boot была решена, и в версии 2.2.0 параметр следует переименовать в agents, чтобы было более интуитивно использовать несколько записей agent внутри него.

person kriegaex    schedule 13.12.2018