2014-06-13 4 views
15

У меня есть проект с несколькими модулями. В настоящее время этот аспект добавляется к «основному» проекту. При выполнении mvn clean install здесь он работает. Однако, пытаясь сделать mvn clean install на родительском проекте он терпит неудачу с этой ошибкой при компиляции одного из других проектов:Ошибка при компиляции при использовании компилятора AspectJ вместо Javac

Типа org.hibernate.annotations.CacheConcurrencyStrategy не может быть решен. Это косвенно ссылается из требуемых .class файлов

Если добавить основную зависимость гибернации в этом проекте тоже работает, но добавление зависимостей в проектах, которые не должны иметь зависимость не имеет смысла - так это не решение. При компиляции с javac он отлично работает.

В чем причина? И как я могу это исправить, поэтому я могу использовать компилятор AspectJ без утечки зависимостей к проектам, которые не должны иметь этого?

Я имею эту конфигурацию в родительском ПОМ:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.5</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Update

Я только что узнал. Запуск mvn clean install терпит неудачу каждый раз. Однако при запуске mvn [clean] install однократное сбой. Затем работает mvn install без clean работ. Я вижу, что builddef.lst в целевой папке - причина, по которой она работает, и не работает на основе того, запускаете ли вы чистую. Итак, теперь мой вопрос: как вы автоматически создаете этот файл?

Родитель POM-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<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 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>core-lib</artifactId> 
    <name>core-lib</name> 
    <packaging>pom</packaging> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>aspectj-maven-plugin</artifactId> 
       <version>1.5</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <complianceLevel>1.6</complianceLevel> 
       </configuration> 
       <executions> 
        <execution> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>1.7.4</version> 
     </dependency> 
    </dependencies> 

    <modules> 
     <module>core-xyz</module> 
     <module>core-xyz2</module> 
    </modules> 
</project> 
+0

Что такое stacktrace исключения и как выглядит ваш аспект? – SpaceTrucker

+0

@KnightRider вы должны обновить свой вопрос вместо добавления комментария. –

+0

@ LeonardBrünings Сделано. –

ответ

3

Включить отладку на Maven вызова копать глубже. Вы должны заметить, что компиляция aspectj только вызывается во время первого вызова maven с помощью clean. Поскольку builddef.lst уже существует после первого вызова, вызов без очистки пропускает компиляцию aspectj.

Этот AspectJ скомпилировать плагин поведение наблюдалось ранее и было описано здесь:

http://out-println.blogspot.com/2007/08/compile-time-checks-with-aspectj-part-2.html?m=1

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

В противном случае необходимы дополнительные зависимости для компиляции aspectj, как вы уже заметили. Я включил aspectj компилировать в свою собственную работу без проблем, ограничив ее только теми модулями, которые этого требуют.

3

В соответствии с AspectJ compiler Maven plugin вы можете установить argumentFileName, чтобы найти существующий builddef.lst.

Таким образом, вы можете сгенерировать builddef.lst и скопировать его в свою папку ресурсов и проинструктировать плагин AspectJ Maven для использования этого файла.

Смежные вопросы