2014-06-13 1 views
15

저는 다중 모듈 프로젝트를 가지고 있습니다. 현재이 aspect는 "핵심"프로젝트에 추가됩니다. 여기 mvn clean install 일 때 그것은 작동합니다. 그러나 부모 프로젝트에 mvn clean install을하려고 그것은 다른 프로젝트 중 하나를 컴파일이 오류와 함께 실패합니다Javac 대신 AspectJ 컴파일러를 사용할 때 컴파일하는 동안 오류가 발생했습니다.

타입 org.hibernate.annotations.CacheConcurrencyStrategy가 해결 될 수 없다. 필수 .class 파일에서 간접적으로 참조됩니다.

해당 프로젝트에 Hibernate 핵심 종속성을 추가해도 작동하지만 종속성이 없어야하는 프로젝트에 종속성을 추가하는 것이 의미가 없습니다. 해결책. 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> 

업데이트 :

나는 부모 POM에서이 구성을 가지고있다. 항상 mvn clean install을 실행하면 실패합니다. 그러나 mvn [clean] install을 한 번 실행하면 실패합니다. 그런 다음 mvn installclean없이 실행하십시오. 대상 폴더의 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

예외의 스택 추적은 무엇이며 aspect는 어떻게 생겼을까요? – SpaceTrucker

+0

@KnightRider 의견을 추가하는 대신 질문을 업데이트해야합니다. –

+0

@ LeonardBrünings 완료. –

답변

3

깊게 파고 받는다는 호출에 디버그를 사용합니다. aspectj 컴파일은 clean을 사용하는 첫 번째 maven 호출 중에 만 호출된다는 것을 관찰해야한다. builddef.lst는 첫 번째 호출 이후에 이미 존재하기 때문에, clean없이 호출하면 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 플러그인이 해당 파일을 사용하도록 지시 할 수 있습니다.

관련 문제