Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类从WAR移动到JAR时发生NoClassDefFoundError_Java_Tomcat_Servlets_Quartz Scheduler - Fatal编程技术网

Java 将类从WAR移动到JAR时发生NoClassDefFoundError

Java 将类从WAR移动到JAR时发生NoClassDefFoundError,java,tomcat,servlets,quartz-scheduler,Java,Tomcat,Servlets,Quartz Scheduler,我正试图以一种允许我将Quartz作业动态添加到类路径的方式部署一个动态web项目。这是我的想法 '如果我从包含完全限定类路径的XML文件中读取配置,然后在类中使用Class.forName()从配置XML创建所述类的实例,那么我应该能够访问Tomcats TOMCAT_HOME/lib目录中动态添加的类' 在此更新之前,应用程序运行良好,但我在war中包含了这些新外部化的类。但是,我不能再这样做了,因为我: 我不想在每次需要新工作时都重新部署战争 无法关闭服务器以添加新作业,因为存在需要连续运

我正试图以一种允许我将Quartz作业动态添加到类路径的方式部署一个动态web项目。这是我的想法

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

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

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

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

    补充:


    @BalusC:我实际上已经开发了一个基于web的管理屏幕,允许用户编辑XML配置文件以添加新作业。然而,要添加的不仅仅是作业的另一个实例,而是一个全新的作业,需要有这个新作业的代码定义。我想把它放在一个jar文件中,放到tomcat lib目录中,由class.forName()拾取。

    希望tomcat不会自动重新加载上下文,也不会自动将jar加载到类加载器中。它可能导致无法控制的行为

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

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


    HIH

    为什么不创建一些基于Web的管理屏幕,允许您在运行时基于DB或XML配置添加新作业?根据您的编辑,从
    URLClassLoader
    开始。如果我把jar放在currentLoader中,那么我就不需要URLClassLoader了。Tomcat的类加载器不会在类路径中拾取运行时的更改(如果有,你根本不会问这个问题)。你不会混淆“hotdeploy”吗通常只在开发过程中打开的功能,因为它相当昂贵。