【问题标题】:ClassNotFoundException Thrown when Dynamically Loading Class Files动态加载类文件时抛出 ClassNotFoundException
【发布时间】:2010-11-02 05:44:19
【问题描述】:

我们有一个 servlet 项目,其中包含(在许多其他类中)我们向用户公开的接口。

用户可以编译他们自己的实现所提供接口的类(以 .class 文件的形式),并将它们放置在我们项目知道的文件夹中。当 servlet 启动时,它使用 URLClassLoader 加载该文件夹中的所有 .class 文件。 (因此用户可以参与某些事件。)

据我所知,类文件的位置和加载正确,有点。加载用户编译的.class文件时,抛出ClassNotFoundException异常,但它在抱怨接口,它应该已经在类路径中。

Caused by: java.lang.ClassNotFoundException: com.company.project.OurInterface
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

动态加载.class文件时,找不到接口是不是有原因?

【问题讨论】:

    标签: java dynamic classpath classloader classnotfoundexception


    【解决方案1】:

    也许您还没有为您的URLClassLoader 指定父类加载器。

    您的应用程序的类加载器应该是动态类加载器的父类加载器:

    ClassLoader dynamicClassLoader = 
        new URLClassLoader(..., OutInterface.class.getClassLoader());
    

    【讨论】:

    • 我几乎在我的问题中提到了将类路径类加载器“附加”到 URLClassLoader 的可能性。我只是对行话有点熟悉,但你的方法听起来很合理。我会试一试,然后告诉你。谢谢。
    • 这也帮了我很多忙——这让我有点发疯。干杯:) x.
    【解决方案2】:

    也许是因为您尝试从“动态类”路径加载该接口?当你把你的界面也放在那里时会发生什么?

    【讨论】:

      【解决方案3】:

      可能是因为您使用了不同的类加载器,但它没有找到由它的类加载器加载的类。

      您是否考虑过为此使用 SPI? http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider(对不起旧链接,但方法是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 2016-01-10
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        相关资源
        最近更新 更多