【问题标题】:Calling JSP files gives a NoSuchMethodError when app deployed outside of Eclipse当应用程序部署在 Eclipse 之外时,调用 JSP 文件会产生 NoSuchMethodError
【发布时间】:2013-04-17 08:03:09
【问题描述】:

我有一个 Maven 项目,它在 Eclipse 中完全按照预期工作。它还在 Eclipse 之外构建和运行,但是当我尝试调用前端(JSP 网页)时,我得到以下信息:

访问 / 时出现问题。原因:

javax.servlet.ServletContext.getJspConfigDescriptor()Ljavax/servlet/descriptor/JspConfigDescriptor;

原因:

java.lang.NoSuchMethodError: javax.servlet.ServletContext.getJspConfigDescriptor()Ljavax/servlet/descriptor/JspConfigDescriptor; ...

我环顾四周,似乎此消息与 Servlet 2.5 和 Servlet 3.0 之间的不兼容有关。但是我的 pom 中已经有 Servlet 3.0 作为依赖项:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
</dependency>

所以我不明白为什么在 eclipse 之外构建和部署时没有包含我需要的依赖项,即使构建本身是成功的。

知道是什么原因造成的以及如何解决吗?

编辑: 未在 web.xml 中配置 JSP 访问。 index.jsp 文件是使用这个 sn-p 为码头服务器设置的欢迎文件:

// configure webapp
WebAppContext webroot = new WebAppContext();
webroot.setResourceBase("src/main/webapp");
webroot.setContextPath("/");
webroot.setWelcomeFiles(new String[] {"index.jsp"});
webroot.setParentLoaderPriority(true);
server.setHandler(webroot);

剩下的几个jsp文件在webapp文件夹里。

编辑 2: 我检查了打包项目时创建的 jar 的内容,似乎 jar 中有多个 javax/servlet/Servlet.class 副本。这有点令人困惑。我假设我的 pom 中的这些其他依赖项(如下所列)必须添加额外的 Servlet.class 文件。

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-server</artifactId>
  <version>8.1.8.v20121106</version>
</dependency>
<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-webapp</artifactId>
  <version>8.1.8.v20121106</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-jsp</artifactId>
    <version>8.1.8.v20121106</version>
</dependency>

但我不确定如何解决这些问题...

如果有人有任何想法,我很想听听。我唯一真正的限制是我必须使用码头 8.1.8.v20121106。

【问题讨论】:

  • 你是在 Tomcat 6 还是 Tomcat 7 中部署这个?
  • 此应用程序已嵌入 Jetty
  • 嵌入式码头的哪个版本?
  • 你能显示你的web.xml吗?
  • 不使用 web.xml 来访问 JSP。我已经用其他详细信息编辑了问题

标签: java jsp maven servlets web-applications


【解决方案1】:

在我看来,您可能在 tomcat 6 上部署了一个 servlet 3.0,它不受支持,会导致此异常。

另一种可能性是您在战争中导出其他 .classes 会干扰 tomcat 的默认库。

【讨论】:

  • 我使用的是嵌入式 Jetty 8。但即使在你的解释中......我很好奇它为什么会在 Eclipse 环境中工作?
  • 因为如果您的网络服务器(tomcat 或 jetty)不支持 3.0 servlet,则会导致该异常,因为特定的类/方法不可用。
  • 在 Eclipse 中运行程序使用的是同一个嵌入式码头,对吗?
  • 你使用的是eclipse SE还是eclipse EE?您是否在 Eclipse EE 中配置了 tomcat 或 jetty 服务器?您的项目是从 public static void main 执行的吗?如果您从 main 执行,那么当您用完 eclipse 时,您可能没有正确配置您的类路径,或者您的 JAR 不包括会导致找不到类定义的依赖库。基本上,如果您在 Eclipse 中的整个项目是一个 SE 项目,则很可能是类路径问题。如果它是一个带有 Eclipse EE 的 WEB 项目,并且配置了服务器等,那就是另一个问题了。
  • 该项目未配置为 Eclipse EE Web 项目,因此我假设您将其称为 SE 项目,因为我真正使用的唯一 EE 组件是 javax.servlet。我没有在 eclipse 中配置任何服务器。是的,该项目是从 public static void main 执行的。因此,从您的回复来看,这似乎是一个类路径问题……奇怪的是,它只会错过这种依赖关系,因为它们都是以相同的方式(通过 maven)添加的。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多