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"/> |