2010-05-13 52 views
4

在我的工作中,我們在一些Java項目中使用了AspectJ。爲了使它與ant構建一起工作,我們已經將aspectjtools.jar放在ant/lib /中。如何覆蓋存儲在ant lib目錄中的ant任務

我現在正在研究一個特定的Java項目,並且需要使用較新版本的aspectJ。我不想讓每個使用該項目的人都更新其aspectjtools.jar的本地副本。相反,我嘗試將新的aspectjtools.jar添加到項目的lib目錄,並將以下行添加到build.xml中。

<taskdef 
    resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" 
    classpath="./lib/aspectjtools.jar" /> 

然而,正如我希望的那樣從螞蟻/ lib目錄/優先於我在類路徑的taskdef指定JAR的ANT類加載器加載罐子這不起作用。

有什麼辦法可以強制ant選擇簽入我項目的jar嗎?

+0

我一直在使用jarjar AspectJ的重新包裝成不同的包裝嘗試,但這個似乎已經打破AspectJ和感覺就像一個巨人黑客,所以我不再追求這種做法。 – mchr 2010-05-13 15:28:07

+0

到目前爲止,我的結論是,沒有辦法強制螞蟻選擇簽入我的項目的jar。這感覺就像一個奇怪的設計選擇,因爲我預料特定項目的build.xml文件是選擇要使用的任務版本的最佳位置。 – mchr 2010-05-14 08:11:36

+0

https://issues.apache.org/bugzilla/show_bug.cgi?id=6606 - 似乎是一個長期存在的錯誤。我正在閱讀評論主題。 – mchr 2010-06-14 23:11:35

回答

3

我的問題的最終答案是否定的。 ANT目前沒有辦法使用ANT lib目錄中優先於任務jar的項目中的任務jar。

3

難道你不能只更新iajc編譯目標在類路徑上使用新的jar?

不可能強制類加載器將給定的jar文件優先於另一個jar文件。如果你必須涉及同一類的幾個版本,那麼你應該考慮OSGI。

最簡單的解決方案是僅使用來自項目或Maven/Ivy存儲庫的庫,並忽略全局ant文件夾中的庫。

一個例子:

<taskdef 
    resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"> 
     <classpath> 
     <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/> 
     </classpath> 
</taskdef> 

<target name="compile" > 
    <iajc outjar="demo.jar"> 
     <sourceroots> 
      <pathelement location=」src」 /> 
     </sourceroots> 
     <aspectpath> 
      <pathelement 
       location="aspects_to_be_weaved_with_classes_in_sourceroots.jar" /> 
     </aspectpath> 
     <classpath> 
      <pathelement location="${basedir}/lib/aspectjrt.jar"/> 
     </classpath> 
    </iajc> 
    </target> 

更新: 您也可以使用其他的螞蟻。如果您使用的是Eclipse,請直接從Ant視圖中嘗試捆綁的一個。

你也有另一種選擇,但它有點困難。那就是使用AspectJ加載時織入來代替。如果你選擇這個選項,你可以用一個普通的編譯任務進行編譯,但是你必須在啓動時使用JVM代理進行編織。你可以閱讀更多關於它here

我希望這有助於!

+0

感謝您的回答。我會測試明天是否有效。 – mchr 2010-05-13 21:13:55

+1

這並不能解決我的問題。 taskdef元素允許你指定一個類路徑,但是我的測試顯示這個類路徑被插入到現有類路徑的末尾。這意味着ANT將始終在ant/lib /目錄中使用aspectjtools.jar,優先於taskdef類路徑中指定的任何版本。 – mchr 2010-05-14 08:09:48

+1

感謝您的更新 - 我可以看到使用另一個螞蟻副本將解決我的問題,但只有通過迴避問題。 加載時間編織是另一個有效的解決方案,但感覺特別複雜。 ANT提供一個項目機制來強制使用哪個版本的任務真的是不合理嗎? – mchr 2010-05-14 12:19:25

1

這是可能的。 你需要利用這一額外任務,以創建一個新的類加載器

http://enitsys.sourceforge.net/ant-classloadertask/

<!--Append the dependent jars to the classpath so we don't have to install them in the ant directory--> 
    <taskdef resource="net/jtools/classloadertask/antlib.xml" 
      classpath="${basedir.dir}/lib/ant-classloadertask.jar"/> 

    <classloader loader="ant.aspectj.loader" parentloader="project"> 
     <classpath> 
      <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/> 
      <pathelement location="${basedir.dir}/lib/ant-classloadertask.jar"/> 
     </classpath> 
     <antparameters parentfirst="false"/> 
     <handler loader="org.apache.tools.ant.AntClassLoader" adapter="org.apache.tools.ant.taskdefs.classloader.adapter.AntClassLoaderAdapter"/> 
    </classloader> 

    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" 
      classpath="${basedir.dir}/lib/aspectjtools.jar"" 
      loaderref="ant.aspectj.loader"/>