java - 将类从 WAR 移动到 JAR 时出现 NoClassDefFoundError

标签 java tomcat servlets quartz-scheduler

我正在尝试以允许我将 Quartz 作业动态添加到类路径的方式部署动态 Web 项目。这是我的想法。

'如果我从包含完全限定类路径的 XML 文件中读取配置,然后在类中使用 Class.forName() 从配置 XML 创建所述类的实例,那么我应该能够访问动态添加的类放在Tomcats的TOMCAT_HOME/lib目录下'。

在此更新之前,应用程序运行良好,但我在 war 中包含了这些新的外部化类。但是,我不能再这样做了,因为我:

  1. 不想每次需要新工作时都重新部署 war 。
  2. 无法关闭服务器以添加新作业,因为有些作业需要持续运行。

但是,当我运行 class.forName() 方法时,我收到了 NoClassDefFoundError。我已经在catalina.properties中验证过Tomcat中的lib目录在common.loader属性中。

我的问题是,如何让我的 WAR 类识别 Tomcat 公共(public)库中 jar 中的类。有任何想法吗?谢谢。

补充:

@BalusC:我实际上已经开发了一个基于 Web 的管理屏幕,允许用户编辑 XML 配置文件以添加新作业。但是,不仅要添加作业的另一个实例,而且要添加一个全新的作业,需要有这个新作业的代码定义。我希望将其放入一个 jar 文件中,然后放入 tomcat lib 目录中,以供 class.forName() 获取。

最佳答案

希望 Tomcat 不会自动重新加载您的上下文或自动在您的类加载器中加载 jar。这可能会导致无法控制的行为。

如果不通过 URLClassLoader 显式加载 jar,您将永远无法访问 WebAppClassLoader(每个 tomcat 上下文管理的类)中的那些新类。我建议使用 jar 的绝对路径。由于一些不为人知的原因,我在相对路径方面遇到了问题。

如果您想知道 tomcat 安装路径,例如 lib 目录,您可以使用 catalina.homecatalina.base 环境变量。

关于java - 将类从 WAR 移动到 JAR 时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807306/

相关文章:

java - 如何处理可选类型列表数据中的数据值

java - 如何在 JAR 中模拟服务

java - 在爆炸前更新 tomcat war 文件(未压缩)

tomcat - Web 容器管理的安全性的常见替代方案?

java - 在 servlet 过滤器中提交响应后无法转发

java - 我可以使用 servlet 在 Web 容器中进行这种复杂的 url 映射吗?

Java Web 应用程序在缓慢的 MySQL 查询中停止

java - Spring Boot + Spring Security - 无法注销

security - 如何使用 ProxyPass 设置在 Tomcat 上保护 Solr?

java - 我如何知道哪个类来自接口(interface)