#spring #maven #intellij-idea #aspectj
Вопрос:
РЕДАКТИРОВАНИЕ/ОБНОВЛЕНИЕ: Делегирование действий по сборке/запуску IDE maven в настройках IntelliJ решает проблему, но как справиться с ней без этого?
У меня есть следующая проблема:
Я что-то меняю в своем классе GetSthAspect — gt; Затем я запускаю чистую установку maven (предположим, что я всегда должен выполнять чистую установку в своем приложении) — gt; gt; Запускаю приложение spring — gt; gt; gt; И вижу ошибку:
java.lang.NoSuchMethodError: com.example.demo.aspects.GetSthAspect.aspectOf()Lcom/example/demo/aspects/GetSthAspect; at com.example.demo.aspects.A.shouldDoSthAndCallMethodGetSth(A.java:15) ~[classes/:na] at com.example.demo.aspects.AspectApp.main(AspectApp.java:18) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.10.jar:5.3.10] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.10.jar:5.3.10] ...
Затем я останавливаю приложение -gt; Снова выполняю чистую установку maven -gt;gt; Снова запускаю приложение, и теперь все работает нормально.
Так всегда бывает, когда я что-то меняю в своем классе GetSthAspect и хочу увидеть свои изменения в приложении. Это почему? Почему я должен создавать приложение -gt; запускать приложение -gt;gt; останавливать приложение -gt;gt;gt; снова создавать приложение и запускать его, чтобы мои аспекты работали нормально? Что я должен сделать, чтобы избежать этой ситуации?
Получить представление
@Aspect public class GetSthAspect { Logger logger = LoggerFactory.getLogger(GetSthAspect.class); @Around("call(* Ent.getSth())") public Object around(ProceedingJoinPoint pjp) throws Throwable { logger.info("Inside around 12:52"); Ent ent = (Ent) pjp.getTarget(); logger.info("Number: " ent.getImportantNumber()); return pjp.proceed(); } }
какой-то класс
public class AspectApp { Logger logger = LoggerFactory.getLogger(AspectApp.class); @GetMapping("/") public String main() { logger.info("Method main started 11:01"); A a = new A(); a.shouldDoSthAndCallMethodGetSth(1); } }
A
public class A { Logger logger = LoggerFactory.getLogger(A.class); public void shouldDoSthAndCallMethodGetSth(Integer a) { // ... Ent ent = new Ent(); ent.setImportantNumber(1); logger.info("Method A do sth and ..."); ent.getSth(); } }
pom.xml
lt;?xml version="1.0" encoding="UTF-8"?gt; lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"gt; lt;modelVersiongt;4.0.0lt;/modelVersiongt; lt;parentgt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-parentlt;/artifactIdgt; lt;versiongt;2.5.5lt;/versiongt; lt;relativePath/gt; lt;!-- lookup parent from repository --gt; lt;/parentgt; lt;groupIdgt;com.examplelt;/groupIdgt; lt;artifactIdgt;demolt;/artifactIdgt; lt;versiongt;0.0.1-SNAPSHOTlt;/versiongt; lt;namegt;Testinglt;/namegt; lt;descriptiongt;App for testslt;/descriptiongt; lt;propertiesgt; lt;java.versiongt;11lt;/java.versiongt; lt;/propertiesgt; lt;dependenciesgt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-aoplt;/artifactIdgt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-data-jpalt;/artifactIdgt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-data-restlt;/artifactIdgt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-weblt;/artifactIdgt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;com.h2databaselt;/groupIdgt; lt;artifactIdgt;h2lt;/artifactIdgt; lt;scopegt;runtimelt;/scopegt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-testlt;/artifactIdgt; lt;scopegt;testlt;/scopegt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.aspectjlt;/groupIdgt; lt;artifactIdgt;aspectjrtlt;/artifactIdgt; lt;versiongt;1.9.7lt;/versiongt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;org.aspectjlt;/groupIdgt; lt;artifactIdgt;aspectjweaverlt;/artifactIdgt; lt;versiongt;1.9.7lt;/versiongt; lt;/dependencygt; lt;/dependenciesgt; lt;buildgt; lt;pluginsgt; lt;plugingt; lt;groupIdgt;org.codehaus.mojolt;/groupIdgt; lt;artifactIdgt;aspectj-maven-pluginlt;/artifactIdgt; lt;versiongt;1.14.0lt;/versiongt; lt;configurationgt; lt;complianceLevelgt;11lt;/complianceLevelgt; lt;sourcegt;11lt;/sourcegt; lt;targetgt;11lt;/targetgt; lt;showWeaveInfogt;truelt;/showWeaveInfogt; lt;verbosegt;truelt;/verbosegt; lt;Xlintgt;ignorelt;/Xlintgt; lt;encodinggt;UTF-8lt;/encodinggt; lt;/configurationgt; lt;executionsgt; lt;executiongt; lt;goalsgt; lt;!-- use this goal to weave all your main classes --gt; lt;goalgt;compilelt;/goalgt; lt;/goalsgt; lt;/executiongt; lt;/executionsgt; lt;/plugingt; lt;/pluginsgt; lt;/buildgt; lt;/projectgt;
Комментарии:
1. Ваш вопрос касается ИДЕИ IntelliJ при использовании AspectJ в проекте Maven, а не AspectJ Maven как такового. Я попробовал ваш код в IDEA 2021.2.3 (Ultimate Edition) и не могу воспроизвести описанную вами проблему. Всякий раз, когда я редактирую аспект , я могу просто снова запустить то же приложение Spring Boot
Ctrl-F5
, и аспект будет повторно скомпилирован и переработан. Вы установили дополнение AspectJ в IDEA? Что-то не так в вашем приложении Spring Boot (вы не разместили его здесь)?2. Кроме того, почему вы используете собственное плетение AspectJ во время компиляции в приложении Spring вместо Spring AOP? У вас должны быть веские причины для этого. Я знаю, что
call()
точечные вырезы доступны только в родном аспекте , но вы могли бы просто использоватьexecution()
, что также привело бы к меньшему количеству классов. Требуется ли вам объединять аспекты в классы, которые не являются компонентами/компонентами, управляемыми весной?3. Обратная связь, пожалуйста. Не очень вежливо задавать вопрос, а затем не реагировать на вопросы людей, которые вызвались вам помочь.
4. Я не устанавливал надстройку AspectJ в IDEA, и мое приложение Spring Boot работает хорошо. Я использую aspectj для выполнения аспекта вокруг метода в классе, который не является компонентом, управляемым весной. По какой-то причине моя версия IntelliJ-2020.2. Когда я компилирую файл xxx.aj, все работает хорошо, но возникает проблема, когда я использую класс java и аннотацию @Aspect, как в примере выше.
5. Весенний АОП не является аспектомj. Поэтому, если вы хотите использовать собственный AspectJ, установите дополнение. Не усложняйте простое дело.
Ответ №1:
Я не могу сказать, в чем проблема. обычно вам не нужно выполнять чистую установку maven каждый раз, когда вы что-то меняете в своем коде.Я предлагаю вам использовать devtools, может быть