gpt4 book ai didi

java - 来自 jar 的类上的 ClassNotFoundException,我可以从中成功加载其他类

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:24 24 4
gpt4 key购买 nike

背景:
我正在尝试在 Java 类中启动嵌入式 Tomcat 服务器,通过 JRuby 从 Ruby 脚本启动。这意味着我使用的所有 jar 都需要从 ruby​​ 脚本加载。

在我的 ruby​​ 脚本中:

require 'java'
load 'servlet-api-2.5.jar'
...
com.mycompany.RunWebApplicationTomcat.main(nil)
//com.mycompany.RunWebApplicationJetty.main(nil) //Commented out for Tomcat Test

Java 类如下:

   public class RunWebApplicationTomcat {

public static void main(String[] args) throws Exception {

try {
Class.forName("javax.servlet.http.HttpServlet");
} catch(ClassNotFoundException e) {
System.err.println(e.getMessage());
}

DispatcherServlet dispatcherServlet = new DispatcherServlet();
....
}
}

问题:
当我运行脚本时,我在 Class.forName 测试中没有发现异常,但在尝试初始化 DispatcherServlet 时,我在 javax.servlet.http.HttpServlet 上得到了 ClassNotFoundException。 (DispatcherServlet 是 spring servlet,但我尝试了其他 servlet 实现并遇到了相同的异常)

为什么我 99.9% 确定 servlet-api.jar 在类路径中:
真正奇怪的是我已经使用相同的模式成功创建了一个嵌入式 Jetty 服务器。该服务器不需要 HttpServlet 类。然而,它确实使用了位于同一个 servlet-api.jar 中的 HttpServletRequest/Response 类,并且它工作得很好。

问题:
1. 有谁知道加载到类路径中的 jar 中的某个特定类是如何找不到的?
2. 是否有一些java 安全机制可以防止类被实例化? (JRuby 可执行文件是一个自定义的、专有的黑盒,所以我不确定里面会发生什么)
3. 我是否可以执行任何其他测试来阐明问题?

堆栈跟踪

Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
... 38 more
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

最佳答案

ClassNotFoundException 可能由多种原因引起,包括以下内容:

  • 有问题的类不存在。

  • 类在那里,但它依赖的其他一些类/接口(interface)/注释/枚举不在那里。

  • 您的类依赖于先前类初始化失败的其他类。

证据似乎与所有这些相矛盾。 (根据 javadoc,Class.forName(String) 触发类初始化。)但是,堆栈跟踪将提供更多证据。


这里的类加载器哪里可能会发生一些棘手的事情;即 DispatcherServlet 类之前使用与 forName 正在使用的“当前”类加载器不同的类加载器加载。

您还应该考虑 forName 抛出您未在示例中测试的不同 Exception(或 Error)的可能性代码。

关于java - 来自 jar 的类上的 ClassNotFoundException,我可以从中成功加载其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com