错误:Servlet Jar未加载...违规类:javax/servlet/Servlet.class

Ank*_*kur 30 java dependencies tomcat

我收到以下错误:

INFO:validateJarFile(C:\ dev\server\tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - jar未加载.参见Servlet Spec 2.3,sectoin 9.7.2.违规类:javax/servlet/Servlet.class

那里的现有资源说它是由于与servlet.jar的冲突或在我的情况下命名为servlet-api.jar文件.我已经从/ webapps文件夹中删除了所有其他项目,我已经获取了tomcat6/lib目录中的servlet-api.jar文件,并将其添加到项目构建路径中,所以我看不到它是怎么回事仍然是一场冲突.

当我尝试运行应用程序时,我得到以下堆栈跟踪.

org.apache.jasper.JasperException:无法为JSP编译类:

生成的java文件中的第22行发生错误方法getJspApplicationContext(ServletContext)未定义类型JspFactory

堆栈跟踪:

org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler. java:439)org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)org.apache.jasper.compiler.Compiler. compile(Compiler.java:299)org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)org.apache.jasper.servlet. JspServlet.serviceJspFile(JspServlet.java:342)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)javax.servlet.http.HttpServlet.service(httpServlet.java:717)

Bal*_*usC 40

这是类路径污染的标志.JSP/Servlet API库依赖于appserver实现,属于Tomcat/lib文件夹中Tomcat 6的情况,应该在其他地方移动或复制.正如您现在遇到的那样,它是可移植性问题和类加载冲突的秘诀.webapp中的库在类加载中具有优先权.如果在servlet-api.jar那里遇到它,它反过来在那里寻找它的依赖,但它们显然在那里缺失.

您必须从webapp中删除任何特定于appserver的库Webapp/WEB-INF/lib.您应该在其中放置特定于webapp的库.将appserver特定的库保留在appserver自己的默认类路径中,这是Tomcat/lib您的情况.保持不变.您最多可以添加您希望在其中的所有Web应用程序之间共享的库,或者甚至更好地为其配置shared.loaderin Tomcat/conf/catalina.properties.

还可以从JDK/libJRE/lib文件夹中删除任何特定于appserver和webapp的库(如果有).我经常看到一些初学者移动/复制那里的库,因为"否则它不会编译".您永远不应该在那里复制非JRK/JRE特定的库.这也是便携性问题的秘诀.javac使用with编译类时,应使用-cp参数指定依赖库.

更新:如果是IDE(您在谈论"构建路径"时似乎使用了一个IDE),则需要将Web项目与应用程序服务器相关联.例如,在Eclipse中,您可以选择在创建动态Web项目期间执行此操作.您需要在项目创建之前在Eclipse中集成服务器实例.您可以通过Servers视图执行此操作(假设您使用Eclipse进行Java EE开发人员,否则进行升级).您也可以通过项目属性中的Servers条目更改它.选择一个您想用作"默认"服务器的服务器,然后将其库自动包含在项目的构建路径中.绝对没有必要在其他地方复制/移动它们.另请参见如何在Eclipse项目中导入javax.servlet API?


Rae*_*ald 20

正如其他答案所说,这是因为您的WAR包含servlet API类,但它不应该这样做.

如果您使用Maven构建项目,则需要告诉Maven在编译和测试时使servlet API可用,但不要将其包含在WAR中.正如关于依赖范围Maven文档所述,您应该使用providedServlet API的范围:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

如果某些依赖项将Servlet API作为编译依赖项引入,您可能还必须明确地将Servlet API排除为传递依赖项:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>frob-driver-core</artifactId>
        <version>1.0.1</version>
        <exclusions>
            <exclusion>
                <artifactId>servlet-api</artifactId>
                <groupId>javax.servlet</groupId>
            </exclusion>
        </exclusions>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

  • 我怎么知道依赖关系是否会引入servlet API? (5认同)
  • 在命令行中使用`mvn dependency:tree` (2认同)