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

标签 java ant classloader

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

Thread.currentThread().getContextClassLoader()

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

有什么解决方法吗?执行以下操作没有帮助:(在我的任务的执行方法中)

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

我的自定义 ant 任务接受了一个嵌套的“类路径”元素。这作为第二个参数传递给 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

希望这对您有所帮助。

关于java - 执行 ANT 任务时的默认类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990143/

相关文章:

java - NetBeans 更改 Ant 版本

java - jFreeChart : Customizing the linear chart axis labels

Java EE 项目看不到数据库更改

java - 递归内部静态类如何初始化?

java - getClassloader失败原因?

java - 确定类来自哪个 JAR 文件

java - 重新安装 Maven 依赖项项目会导致已运行的应用程序出现 NoClassDefFoundError

java - org.apache.hadoop.io.compress.GzipCodec,此类中的GzipOutputStream未关闭,因此内存泄漏

java - 使用 ant 路径作为 bootclasspath 中的属性

Ant: "Duplicated project name in import"带有导入的构建文件