执行ANT任务时的默认Classloader

我实现了一个自定义的ANT任务(扩展org.apache.tools.ant.Task),它在内部使用当前线程的上下文类加载器。 (看起来像这样)

Thread.currentThread().getContextClassLoader()

如果任务例如通过任何java类中的随机主方法执行,则所有内容都按预期工作。 问题是,如果我构建一个jar,包含这个任务和它需要的所有东西,并在另一个项目build.xml中为我自己的任务定义...那么ANT似乎使用它自己的类加载器。 这导致了许多问题,因为ANT类加载器不能知道我的类。

有没有解决方法? 做下面的事情没有帮助:(在我的任务的执行方法内)

 Thread.currentThread()
       .setContextClassLoader(AnyOwnClass.class.getClassLoader());

是否有可能获得“真正”的类加载器? 你能帮忙的话,我会很高兴


有关详细信息,请参阅此问题,一种可能的解决方案可能是ant-classloader任务。


我也遇到了这个类加载问题,在尝试了几天的各种事情之后,最终创建了一个新的类加载器,并在执行我的自定义任务时将其设置为当前类加载器。

        ClassLoader currentClazzLoader = Thread.currentThread().getContextClassLoader();
        try {
            ClassLoader customClazzLoader = ClasspathUtils.getUniqueClassLoaderForPath(getProject(), classpath, false);
            Thread.currentThread().setContextClassLoader(customClazzLoader);
            Class<?> clazz = customClazzLoader.loadClass("xxx");
            ....
            // use reflection to instantiate/call methods
            ....
        } catch (Exception e) {
            throw new BuildException(x);
        } finally {
            Thread.currentThread().setContextClassLoader(currentClazzLoader);
        }

我的自定义ant任务接受了一个嵌套的“classpath”元素。 这是作为第二个参数传递给ClasspathUtils.getUniqueClassLoaderForPath方法的。 这样摆脱了我通过Ant调用时遇到的下面的类加载问题。

Caused by: java.lang.ClassNotFoundException: org.apache.velocity.tools.config.Data
       at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
       at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
       at org.apache.commons.digester.ObjectCreateRule.begin(ObjectCreateRule.java:205)
       at org.apache.commons.digester.Rule.begin(Rule.java:175)
       at org.apache.commons.digester.Digester.startElement(Digester.java:1453)
       ... 48 more

希望这可以帮助。

链接地址: http://www.djcxy.com/p/7717.html

上一篇: Default Classloader when executing ANT task

下一篇: Importing ant build.xml in Eclipse