我已经实现了一个自定义ANT任务(扩展org.apache.tools.ant.Task),它在内部使用当前线程的上下文类加载器。 (看起来像这样)
Thread.currentThread().getContextClassLoader()
如果任务是通过任何java类中的随机main方法执行的,那么一切都按预期工作。问题是,如果我构建一个jar,包含这个任务和它需要的一切,并在一个项目build.xml中定义一个我自己的任务...然后ANT似乎使用自己的类加载器。这会导致许多问题,因为ANT类加载器无法知道我的类。
这有什么解决方法吗?做以下事情没有帮助:(我的任务的内部执行方法)
Thread.currentThread()
.setContextClassLoader(AnyOwnClass.class.getClassLoader());
甚至可以获得“真正的”类加载器吗?任何帮助都会很好
答案 0 :(得分:0)
有关详细信息,请参阅this question,一种可能的解决方案可能是ant-classloader task。
答案 1 :(得分: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”元素。这是作为第二个arg传递给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
希望这会有所帮助。