2013-07-26 73 views
6

我想爲使用@Configurable標註標記的類編譯編譯時間,以便能夠將彈簧依賴關係注入到由new運算符安裝的類中。我不想使用加載時編織,因爲我無法訪問運行應用程序服務器的腳本,所以我無法修改它。另外我希望能夠在測試中使用這些類,我的意思是從IDE運行測試用例。我發現的信息僅僅是關於在web和spring引用上加載時間編織的信息,沒有關於編譯時編織的配置信息。在非彈簧管理類中編譯DI的時間編織

PS。我用彈簧與Maven

+0

Eclipse或IntelliJ或其他? –

+0

我使用eclipse IDE – maks

回答

1

像這樣的事情在你的POM應該工作...

  <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>aspectj-maven-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <configuration> 
          <source>${source}</source> 
          <target>${target}</target> 
          <verbose>true</verbose> 
          <aspectLibraries> 
           <aspectLibrary> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-aspects</artifactId> 
           </aspectLibrary> 
          </aspectLibraries> 
         </configuration> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <configuration> 
          <source>${source}</source> 
          <target>${target}</target> 
          <verbose>false</verbose> 
          <aspectLibraries> 
           <aspectLibrary> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-aspects</artifactId> 
           </aspectLibrary> 
          </aspectLibraries> 
         </configuration> 
         <goals> 
          <goal>test-compile</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <!-- Ensure aspectj tools version used by compiler is the same version used as dependency. Avoids warning --> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjtools</artifactId> 
         <version>${aspectj.version}</version> 
        </dependency> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjweaver</artifactId> 
         <version>${aspectj.version}</version> 
        </dependency> 
       </dependencies> 
      </plugin> 

然後確保你有你的類路徑上的彈簧方面。

而且在Eclipse中aspecting - 安裝AJDT

+0

我在類路徑上有spring-aspects,但是當我嘗試編譯(mvn compile)項目時,我得到了嵌套錯誤:'無法確定缺少類型javax.persistence.Entity的註釋。但我甚至不會在我的項目中使用它(我沒有休眠或其他jpa兼容工具) – maks

+0

另外我注意到它試圖編織我所有的類(即使它們未標記爲「@Configurable ') – maks

+0

另外,什麼是'$ {aspectj.version}'。它意味着什麼版本? – maks

4

所以對方的回答也是有效的,但我想我會在稍微詳細介紹一些這種方法的含義。

我使用的設置是在一個基本水平這一點: -

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
       <outxmlfile>META-INF/aop.xml</outxmlfile> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-aspects</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
       <source>1.7</source> 
       <target>1.7</target> 
       <forceAjcCompile>true</forceAjcCompile> 
      </configuration> 
     </plugin> 

現在,關於依賴一些額外的信息: -

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${dep.spring}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>${dep.spring}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0</version> 
     <scope>provided</scope> 
    </dependency> 

我想你錯過了持久性API,它用於編織。編號:https://jira.springsource.org/browse/SPR-6819春季的bug。這似乎是你需要持久性API的原因。

也有幫助可以創建一個maven作業來編織,如果在ide中unweaved類(這種情況對我來說很重要)。

aspectj:compile 

最後,如果你打算進行單元測試你的類,它可以是這個階段之後編織類有用。我們編織在prepare-package階段。如果你想這樣做添加

 <executions> 
       <execution> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 

到你的插件。

我希望有幫助,因爲在IDE中使用這種方法可能會非常困難。

+0

爲什麼我需要持久性API?我不使用它。我無法想象它如何用於織造。我假設spring-aspects中的某些方面可以與這個api一起工作,所以aspectj-maven-pluging必須有一個選項來選擇aspectjLibraries中的具體方面以用於編織過程。另外,爲什麼我需要aspectjrt依賴,我不使用加載時編織 – maks

+1

嗨,我添加了持久性東西的jira問題。 – MikePatel

+0

此外,方面運行時間不適用於編譯時織入。您可以通過避免cflow pointcut指示符和thisJoinPoint操作(我已閱讀)來儘量減少使用它的需要。你是否處於一種無法爲項目或其他東西引入更多依賴的情況? – MikePatel