在我的工作中,我们在一些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?
答案 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"/>