我正在尝试以允许我将 Quartz 作业动态添加到类路径的方式部署动态 Web 项目。这是我的想法。
'如果我从包含完全限定类路径的 XML 文件中读取配置,然后在类中使用 Class.forName() 从配置 XML 创建所述类的实例,那么我应该能够访问动态添加的类放在Tomcats的TOMCAT_HOME/lib目录下'。
在此更新之前,应用程序运行良好,但我在 war 中包含了这些新的外部化类。但是,我不能再这样做了,因为我:
- 不想每次需要新工作时都重新部署 war 。
- 无法关闭服务器以添加新作业,因为有些作业需要持续运行。
但是,当我运行 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.home
和 catalina.base
环境变量。
高
关于java - 将类从 WAR 移动到 JAR 时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807306/