2014-03-02 49 views
6

我們使用Maven AspectJ插件來構建我們的Web應用程序。它利用「weaveDependencies」向某些依賴關係jar文件添加方面。使用Maven AspectJ編織依賴時的重複類

現在我們結束Web應用程序歸檔中的一些類的兩個版本,一個在WEB-INF/classes中,另一個在WEB-INF/lib的原始jar文件中。看起來只有classes中的那個方面。

恐怕這可能會導致問題。

解決此問題的最佳方法是什麼?

討論同樣的問題(沒有解決方案)over at the Eclipse forums


整個pom.xml本身是巨大的,當然,包含的子項目也有它們自己的。我希望WAR項目下面的摘錄足夠豐富。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
     <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors> 
     <filters> 
      <filter>${basedir}/src/etc/${environment}/environment.properties</filter> 
     </filters> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.2</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 --> 
    <dependencies> 
     <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see 
      MNG-2972) --> 
     <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> 
    <executions> 
     <execution> 
      <goals> 
       <goal>compile</goal> 
       <goal>test-compile</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <outxml>true</outxml> 
     <aspectLibraries> 
      <aspectLibrary> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <weaveDependencies> 
      <weaveDependency> 
       <groupId>OURPROJECT</groupId> 
       <artifactId>OURPROJECT-api</artifactId> 
      </weaveDependency> 
      <weaveDependency> 
       <groupId>OURPROJECT</groupId> 
       <artifactId>OURPROJECT-service</artifactId> 
      </weaveDependency> 
     </weaveDependencies> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
</plugin> 
+0

請顯示您的pom文件? – khmarbaise

+0

@khmarbaise:增加了一個提取,希望有所幫助。 – Thilo

回答

4

在一個servlet容器和WAR內部,WEB-INF/classes中的類總是優先於在WEB-INF/lib中的jar中找到完全相同名稱的類。

這是從servlet spec報價:

Web應用程序的類加載器必須在 WEB-INF/lib目錄從WEB-INF/ classes目錄第一個加載類,然後再從庫JAR目錄。

至少從Servlet 2.4開始,這一直是如此。這使得應用程序可以選擇性地修補幾個庫類,而無需手動或通過Maven插件重新打包jar。

就你而言,你可以確定具有方面的類將始終被採用,因爲它們在WEB-INF/classes中,並且優先於WEB-INF/lib中的類。

+0

因此,AspectJ插件應該以這種方式工作,我應該與重複生活在一起(並且無法通過交換我們的jar文件來修補我的war文件,因爲這些文件被數百個單獨的類文件覆蓋)?爲什麼jar文件包含在Web應用程序中呢?插件不應該過濾出來嗎? – Thilo

+2

嘗試將聲明OURPROJECT-api和OURPROJECT-service的依賴項給Maven作用域'provided',這樣它們將在編譯時可用於插件,但不包含在WAR中。這將刪除重複 –

+0

我喜歡那個關於「提供」的建議。但是這取決於那些被編織器複製的jar文件中的* all *文件,不僅僅是Java類(或者甚至只是帶有註釋/方面的Java類)。我會檢查是否似乎是這種情況。 – Thilo