Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行ANT任务时的默认类加载器_Java_Ant_Classloader - Fatal编程技术网

Java 执行ANT任务时的默认类加载器

Java 执行ANT任务时的默认类加载器,java,ant,classloader,Java,Ant,Classloader,我已经实现了一个自定义ANT任务(扩展org.apache.tools.ANT.task),它在内部使用来自当前线程的上下文类加载器。(看起来像这样) 例如,如果任务是通过来自任何java类的随机main方法执行的,那么一切都会按照预期工作。问题是,如果我构建一个jar,包含这个任务和它需要的所有内容,并在另一个项目build.xml中为我自己的任务定义。。。然后ANT似乎使用自己的类加载器。这导致了许多问题,因为ANT类加载器无法知道我的类 有什么解决办法吗?像这样做没有帮助:(在我任务的ex

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

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

有什么解决办法吗?像这样做没有帮助:(在我任务的execute方法中)


甚至有可能得到“真正的”类加载器吗?任何帮助都很好

有关详细信息,请参见,一个可能的解决方案可能是。

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

        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);
        }

希望这能有所帮助。

我已经尝试过通过向taskdefinition添加标记来修改类路径,但没有成功。无论如何,如果我在运行ant时只使用-lib参数,那么一切都会按预期工作。。。
 Thread.currentThread()
       .setContextClassLoader(AnyOwnClass.class.getClassLoader());
        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);
        }
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