在Ant“javascript”脚本任务中使用“createTask”与“new”时会加载多个类加载器

时间:2014-02-24 20:53:17

标签: java ant classpath classloader

我正在尝试在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()”之类的时候使用了两个不同的类加载器。 还有其他人解决了这个问题吗?感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

好吧,我能够解决这个问题。

我相信可能会有一个更优雅的解决方案,但我最终做的是使用

jmxInvokeTask.getClass().getClassLoader().loadClass("org.apache.catalina.ant.jmx.Arg").newInstance();

而不只是做“新......”。这样我使用了用于创建jmxInvokeTask的相同类加载器。