2016-08-20 5 views
2

У меня есть мультимодульный проект Maven и настроен Spring AOP в одном из моих модулей. К сожалению, АОП работает только для проекта, где он есть. Вот мой Maven конфигурации:AOP аспекты в мультимодульном проекте Maven

Родитель pom.xml:

<parent> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <groupId>org.springframework.boot</groupId> 
    <version>1.3.6.RELEASE</version> 
</parent> 

<modules> 
    <module>rabbitmq</module> 
    <module>rss_parser</module> 
</modules> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 
</dependencies> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

Первый модуль (где мой АОП конфигурации есть):

<groupId>com.rss.rabbitmq</groupId> 
<artifactId>rabbitmq</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>rabbitmq</name> 

<parent> 
    <groupId>gpw.radar.rss</groupId> 
    <artifactId>parent-module</artifactId> 
    <version>1.0</version> 
</parent> 

<properties> 
    <java.version>1.8</java.version> 
    <rss.parser.version>1.0-SNAPSHOT</rss.parser.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-amqp</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.rss.parser</groupId> 
     <artifactId>rss-parser</artifactId> 
     <version>${rss.parser.version}</version> 
    </dependency> 
</dependencies> 

Второй модуль (где АОП не работает) :

<groupId>com.rss.parser</groupId> 
<artifactId>rss-parser</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>rss_parser</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <junit.version>4.12</junit.version> 
    <rometools.version>1.7.0</rometools.version> 
    <jackson-datatype-jsr310.version>2.6.1</jackson-datatype-jsr310.version> 
    <jackson-databind.version>2.6.6</jackson-databind.version> 
</properties> 

<parent> 
    <groupId>gpw.radar.rss</groupId> 
    <artifactId>parent-module</artifactId> 
    <version>1.0</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>com.rometools</groupId> 
     <artifactId>rome-fetcher</artifactId> 
     <version>${rometools.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>${jackson-datatype-jsr310.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>${jackson-databind.version}</version> 
    </dependency> 
</dependencies> 

И, наконец, моя конфигурация AOP Spring от первого модуля:

@Pointcut("within(com.rss.rabbitmq.cron..*) || within(com.rss.rabbitmq.sender..*) || within(com.rss.parser..*)") 
public void loggingPointcut() { 
} 

И я использую Pointcut в этом аспекте:

@Around("loggingPointcut()") 
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { 
    // <<implementation>> 
} 

После некоторого копания, я понимаю, что он должен работать нормально, если у меня есть MyProject/банка в пути к классам, но в моем случае это делает не работа. AOP для первого модуля, поэтому для "within(com.rss.rabbitmq.cron..*) || within(com.rss.rabbitmq.sender..*)" работает правильно, но для второго проекта это не так.

Также я пытался изменить имя пакета, так как первые части совпадают, и я думал, что это может вызвать проблему, но это не так.

ответ

0

Родительские зависимости не наследуются должным образом, используйте dependencyManagement.

это более четко объяснено в documentation here

родительским - pom.xml

<parent> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <groupId>org.springframework.boot</groupId> 
    <version>1.3.6.RELEASE</version> 
</parent> 

<modules> 
    <module>rabbitmq</module> 
    <module>rss_parser</module> 
</modules> 

<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

<build> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

первый модуль - pom.xml

<groupId>com.rss.rabbitmq</groupId> 
<artifactId>rabbitmq</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>rabbitmq</name> 

<parent> 
    <groupId>gpw.radar.rss</groupId> 
    <artifactId>parent-module</artifactId> 
    <version>1.0</version> 
</parent> 

<properties> 
    <java.version>1.8</java.version> 
    <rss.parser.version>1.0-SNAPSHOT</rss.parser.version> 
</properties> 

<dependencies> 
    <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-amqp</artifactId> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 
    <dependency> 
    <groupId>com.rss.parser</groupId> 
    <artifactId>rss-parser</artifactId> 
    <version>${rss.parser.version}</version> 
    </dependency> 
</dependencies> 

второго модуля - pom.xml

<groupId>com.rss.parser</groupId> 
<artifactId>rss-parser</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>rss_parser</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <junit.version>4.12</junit.version> 
    <rometools.version>1.7.0</rometools.version> 
    <jackson-datatype-jsr310.version>2.6.1</jackson-datatype-jsr310.version> 
    <jackson-databind.version>2.6.6</jackson-databind.version> 
</properties> 

<parent> 
    <groupId>gpw.radar.rss</groupId> 
    <artifactId>parent-module</artifactId> 
    <version>1.0</version> 
</parent> 

<dependencies> 
    <dependency> 
    <groupId>com.rometools</groupId> 
    <artifactId>rome-fetcher</artifactId> 
    <version>${rometools.version}</version> 
    </dependency> 
    <dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
    <version>${jackson-datatype-jsr310.version}</version> 
    </dependency> 
    <dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>${jackson-databind.version}</version> 
    </dependency> 
</dependencies> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-aop</artifactId> 
</dependency> 
+0

Это не сработало. Наверное, мне не хватает концепции весны. Я сделал сперва проекты для модулей1 и module2. Для модуля 2 я выполнил установку mvn, тогда я запускаю пакет mvn для модуля 1, но все же aop не работает для modul2. – Pulkownik

0

Наконец-то я нашел, где была проблема. Из документации Spring AOP:

Если вам нужно только посоветовать выполнение операций по Spring бобов, то Spring AOP является правильным выбором. Если вам необходимо сообщить объекты, которым не управляет контейнер Spring (например, объекты домена обычно), вам необходимо использовать AspectJ.

Поскольку мой второй модуль не использует пружину вообще, я должен использовать AspetJ вместо весенних аспектов.

+0

Точно. Вы должны использовать [AspectJ Maven Plugin] (http://www.mojohaus.org/aspectj-maven-plugin/), чтобы скомпилировать и переплетать ваши аспекты. Плагин имеет опции для включения аспектов других модулей в ваши простые Java-модули. – kriegaex