有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java错误:未加载Servlet Jar。。。有问题的类:javax/servlet/servlet。班

我得到以下错误:

INFO: validateJarFile(C:\dev\server\tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, sectoin 9.7.2. Offending class: javax/servlet/Servlet.class

现有的资源表明,这是由于与servlet冲突造成的。jar或在我的例子中命名为ServletAPI。jar文件。我已经从/webapps文件夹中删除了所有其他项目,我已经使用了servlet api。jar文件,该文件位于tomcat6/lib目录中,并且仅将其添加到项目构建路径中,因此我看不出仍然存在冲突

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

组织。阿帕奇。贾斯珀。JasperException:无法为JSP编译类:

An error occurred at line: 22 in the generated java file The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory

Stacktrace:

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)


共 (6) 个答案

  1. # 1 楼答案

    您收到的第一条错误消息是,Tomcat不需要加载servlet jar,因为它已经有了一个,并且希望避免冲突

    你通常可以放心地忽略这个警告。如果你不想让它出现,你需要将servlet jar从你的项目中移出,而不是使用tomcat中的servlet jar。通过使用tomcat one并将其放入您的项目中,您已经成功说服tomcat从您的webapp加载它,而不是从它预期的位置加载它,从而导致了BalusC的回答中提到的类加载器问题

    编辑:对上面的内容进行了编辑,以澄清将tomcat中的servlet api jar放入webapp(以及属性BalusC)后发生了什么

  2. # 2 楼答案

    这是类路径污染的迹象。JSP/Servlet API库依赖于appserver实现,在Tomcat 6的情况下属于Tomcat/lib文件夹,不应以任何方式移动或复制到其他地方。正如您现在所遇到的,这是导致可移植性问题和类加载冲突的原因。webapp中的库在类加载中具有优先权。如果在那里遇到servlet-api.jar,它会在那里寻找它的依赖项,但它们显然在那里丢失了

    您必须从webapp的Webapp/WEB-INF/lib中删除任何特定于appserver的库。你应该把特定于webapp的库放在那里。将特定于appserver的库保存在appserver自己的默认类路径中,在您的示例中是Tomcat/lib。保持原样。你最多可以添加你想在所有webapp中共享的库,或者更好的是,在Tomcat/conf/catalina.properties中配置shared.loader

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

    更新:如果是IDE(您在谈论“构建路径”时似乎使用了IDE),则需要将web项目与应用程序服务器相关联。例如,在Eclipse中,您可以在创建动态Web项目时选择这样做。在创建项目之前,需要在Eclipse中集成服务器实例。您可以通过Servers视图(假设您使用的是eclipseforjavaEEdevelopers,否则升级)。之后,您还可以通过项目属性中的服务器条目对其进行更改。选择一个您想用作“默认”服务器的,然后它的库将自动包含在项目的构建路径中。绝对没有必要将它们复制/移动到其他地方。另见How do I import the javax.servlet API in my Eclipse project?

  3. # 3 楼答案

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

    如果您使用Maven来构建项目,您将希望告诉Maven在编译和测试时使servlet API可用,但不要将其包括在WAR中。正如Maven documentation about dependency scope所说,您应该为Servlet API使用provided作用域:

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
    

    如果您的一些依赖项将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>
    
  4. # 4 楼答案

    不允许您部署覆盖由web容器提供的Servlet规范中定义的类。您可以从

    http://www.jcp.org/aboutJava/communityprocess/final/jsr053/

    自己检查一下。第9.7.2节见第63页

    Servlet 2.3是一个相当旧的版本,表示Tomcat的一个古老版本。有没有什么特别的原因让你不用新的

  5. # 5 楼答案

    事实上,我有这样的错误和应用程序。无法开始,因为出于某种原因,WEB-INF/lib中的一些JAR具有.JAR(大写)扩展名,而不是.jar。所以要确保所有的罐子都是有效的

  6. # 6 楼答案

    排除和provided依赖项在子项目中不起作用

    如果在Maven项目中使用继承,则必须在父pom.xml文件中包含此配置。你的pom中将有一个<parent>...</parent>部分。xml如果您使用的是继承。所以在你的父母pom.xml中会有这样的东西:

    <groupId>some.groupId</groupId>
    <version>1.0</version>
    <artifactId>someArtifactId</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>child-module-1</module>
        <module>child-module-2</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>