4

在我的工作中,我们在一些 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。

有什么方法可以强制 ant 选择签入我项目的 jar 吗?

4

3 回答 3

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 代理进行编织。你可以在这里阅读更多关于它的信息。

我希望这有帮助!

于 2010-05-13T16:46:44.803 回答
3

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

于 2010-07-03T16:27:42.403 回答
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"/>
于 2012-04-16T18:22:10.827 回答