2014-02-24 19 views
2

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

Thread.currentThread().getContextClassLoader() 

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

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

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

是否有可能获得“真正的”类加载器?任何帮助将很好

回答

0

有关详细信息,请参见this question,一种可能的解决方案可能是ant-classloader task

+0

我已经尝试修改类路径,只需在我的taskdefinition中添加一个标记,但该标记无效。无论如何,如果我只是在运行ant时使用-lib参数,一切都按预期工作...... – user1502353

0

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

 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 

希望这会有所帮助。

相关问题