将类从WAR移动到JAR时的NoClassDefFoundError

时间:2012-12-10 18:55:10

标签: java tomcat servlets quartz-scheduler

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

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

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

  1. 每次需要新工作时都不想重新部署战争。
  2. 由于需要连续运行的作业,无法关闭服务器以添加新作业。
  3. 但是,当我运行class.forName()方法时,我得到一个NoClassDefFoundError。我已经在catalina.properties中验证了Tomcat中的lib目录位于common.loader属性中。

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

    此外:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

HIH