Невозможно запустить приложение AspectJ CTW в IntelliJ IDEA без перестройки Maven

#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, может быть