我正在尝试在Ant中运行脚本,我遇到了与类加载器和类路径相关的问题。 这是我的脚本的具体细节
<taskdef name="jmxInvoke" classname="org.apache.catalina.ant.jmx.JMXAccessorInvokeTask" classpath=${someClassPath} />
<script language="javascript>
importClass(org.apache.catalina.ant.jmx.Arg);
var jmxInvokeTask = project.createTask("aJMXInvokeAntTask")
var someArg = new Arg();
someArg.setValue("someValue");
someTask.addArg(someArg);
</script>
当我在我的ANT_HOME / lib中有“catalina-ant.jar”时,上面的脚本运行正常。我试图更新脚本,假设我无法将catalina-ant.jar复制到其他环境中的ANT_HOME / lib。因此,我试图找到一种方法,在运行此脚本时,我可以使用类路径中的catalina-ant.jar。结果我试图指定类路径,在此期间我得到一个异常,说“jmxInvokeTask”中没有这样的“addArg”方法,它采用“Arg”类型的参数。这对我来说非常困惑,因为JMXAccessorInvokeTask确实有这种方法。当我看得更深时,我发现Ant在指定类路径时使用了不同的类加载器。此外,当我对类加载器进行比较时,似乎在我们调用“project.createTask”时和当我们说“new Arg()”之类的时候使用了两个不同的类加载器。 还有其他人解决了这个问题吗?感谢。
答案 0 :(得分:0)
请参阅How to load an optional task into ant without -lib or global installation?了解解决方案,您也可以使用ant-classloader task。
答案 1 :(得分:0)
好吧,我能够解决这个问题。
我相信可能会有一个更优雅的解决方案,但我最终做的是使用
jmxInvokeTask.getClass().getClassLoader().loadClass("org.apache.catalina.ant.jmx.Arg").newInstance();
而不只是做“新......”。这样我使用了用于创建jmxInvokeTask的相同类加载器。