如何覆盖存放在ant lib目录中的ant任务

时间:2010-05-13 09:41:43

标签: java ant build classpath aspectj

在我的工作中,我们在一些Java项目中使用AspectJ。为了使这与ant构建一起使用,我们一直将aspectjtools.jar放在ant / lib /.

我现在正在开发一个特定的Java项目,需要使用更新版本的aspectJ。我不想让所有使用该项目的人更新其aspectjtools.jar的本地副本。相反,我尝试将较新的aspectjtools.jar添加到项目的lib目录中,并将以下行添加到build.xml。

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

然而,这并不像我希望的那样,因为ANT类加载器从ant / lib /首先加载jar,而不是我在taskdef类路径中指定的jar。

有没有办法强迫蚂蚁选择检查进入我项目的jar?

3 个答案:

答案 0 :(得分:3)

你不能只更新iajc编译目标以在类路径上使用新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>

<强>更新 您还必须使用另一个Ant。如果您正在使用Eclipse,请直接从Ant视图中尝试捆绑的。

您还有另一种选择,但这有点困难。那就是使用AspectJ加载时编织。如果选择该选项,则可以使用普通编译任务进行编译,但必须在启动时使用JVM代理进行编织。您可以阅读更多相关信息here

我希望这有帮助!

答案 1 :(得分:3)

我的问题的最终答案是否定的。目前,ANT无法使用项目中的任务jar而不是ANT lib目录中的任务jar。

答案 2 :(得分: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"/>