关于Java:如何覆盖存储在ant lib目录中的ant任务

How to override ant task stored in ant lib directory

在我的工作中,我们在某些Java项目中使用AspectJ。 为了使此功能与ant构建配合使用,我们已将Aspectjtools.jar放置在ant / lib /中。

我现在正在一个特定的Java项目上工作,需要使用AspectJ的较新版本。 我不想让每个使用该项目的人都更新他们的Aspectjtools.jar的本地副本。 相反,我尝试将较新的Aspectjtools.jar添加到项目的lib目录中,并将以下行添加到build.xml中。

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

但是,这没有按我希望的那样工作,因为ANT类加载器从ant / lib /加载jar文件,而不是在taskdef类路径中指定的jar文件中加载。

有什么方法可以迫使蚂蚁将选中的jar放入我的项目中吗?


我的问题的最终答案是"否"。当前,ANT无法使用项目中的任务jar优先于ANT lib目录中的任务jar。


您不能只更新iajc编译目标以在类路径上使用新的jar吗?

不可能强迫类加载器优先于给定的jar文件而不是另一个。如果必须涉及同一类的多个版本,则应考虑使用OSGI。

最简单的解决方案是仅使用项目或Maven / Ivy存储库中的库,而忽略全局ant文件夹中的库。

一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 <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>
       
            <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代理进行编织。你可以在这里读更多关于它的内容。

我希望这有帮助!


这个有可能。
您需要利用此额外任务来创建新的类加载器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <!--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>
       
        <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"/>