I have a web application which works fine if i just deploy it on to the deploy folder of either Tomcat or Jboss. What i am trying to do now is to embed this application on to a Jetty container. I cant seem to get it to work as it is spitting out errors related to the JSTL tag library. Here is the error that is shown:
Problem accessing /Web/app/localTimestamp. Reason:
/WEB-INF/views/localTimestamp.jsp(1,62) PWC6188: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
Caused by:
org.apache.jasper.JasperException: /WEB-INF/views/localTimestamp.jsp(1,62) PWC6188: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:172)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:431)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:240)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:502)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:582)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1652)
at org.apache.jasper.compiler.Parser.parse(Parser.java:185)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:145)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:212)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:575)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:485)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:537)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:412)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:271)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1157)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:927)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:575)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:485)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:519)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:412)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:351)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:451)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:916)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:611)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
at java.lang.Thread.run(Thread.java:619)
I dont understand why it is not able to pick up the jstl jar file. Here are the jar files in the WEB-INF/lib folder of the web application
19/06/2012 14:54 62,983 activation-1.1.jar
19/06/2012 14:53 4,467 aopalliance-1.0.jar
19/06/2012 14:57 59,590 commons-fileupload-1.2.2.jar
19/06/2012 14:57 163,151 commons-io-2.1.jar
19/06/2012 14:54 207,723 commons-lang-2.1.jar
19/06/2012 14:53 60,686 commons-logging-1.1.1.jar
19/06/2012 14:54 104,172 jaxb-api-2.2.jar
19/06/2012 14:54 872,831 jaxb-impl-2.2.jar
19/06/2012 14:57 414,240 jstl-1.2.jar
19/06/2012 14:53 367,444 log4j-1.2.14.jar
19/06/2012 14:53 17,384 slf4j-api-1.5.2.jar
19/06/2012 14:53 9,501 slf4j-log4j12-1.5.2.jar
19/06/2012 14:53 331,474 spring-aop-3.1.0.RELEASE.jar
19/06/2012 14:53 53,079 spring-asm-3.1.0.RELEASE.jar
19/06/2012 14:53 589,253 spring-beans-3.1.0.RELEASE.jar
19/06/2012 14:53 829,601 spring-context-3.1.0.RELEASE.jar
19/06/2012 14:53 106,819 spring-context-support-3.1.0.RELEASE.jar
19/06/2012 14:53 442,400 spring-core-3.1.0.RELEASE.jar
19/06/2012 14:53 176,283 spring-expression-3.1.0.RELEASE.jar
19/06/2012 15:04 61,379 spring-oxm-3.0.6.RELEASE.jar
19/06/2012 14:53 246,036 spring-tx-3.1.0.RELEASE.jar
19/06/2012 14:53 540,819 spring-web-3.1.0.RELEASE.jar
19/06/2012 14:53 572,266 spring-webmvc-3.1.0.RELEASE.jar
19/06/2012 14:56 493,742 spring-ws-core-2.0.3.RELEASE.jar
19/06/2012 14:56 92,942 spring-xml-2.0.3.RELEASE.jar
19/06/2012 14:54 23,346 stax-api-1.0-2.jar
19/06/2012 14:56 148,522 wsdl4j-1.6.1.jar
19/06/2012 14:54 1,229,125 xercesImpl-2.9.1.jar
19/06/2012 14:55 109,318 xml-apis-1.0.b2.jar
And these are the libraries that are included in the Jetty starter application:
16/07/2012 17:35 117,444 javax.el-2.2.3.jar
16/07/2012 17:35 38,863 javax.el-api-2.2.4.jar
16/07/2012 17:35 545,240 javax.servlet.jsp-2.2.3.jar
16/07/2012 17:35 53,124 javax.servlet.jsp-api-2.2.1.jar
16/07/2012 14:03 21,212 jetty-continuation-8.1.0.RC5.jar
16/07/2012 14:03 93,383 jetty-http-8.1.0.RC5.jar
16/07/2012 14:03 101,433 jetty-io-8.1.0.RC5.jar
16/07/2012 14:03 86,238 jetty-security-8.1.0.RC5.jar
16/07/2012 14:03 330,266 jetty-server-8.1.0.RC5.jar
16/07/2012 14:03 95,359 jetty-servlet-8.1.0.RC5.jar
16/07/2012 14:03 268,069 jetty-util-8.1.0.RC5.jar
16/07/2012 14:03 106,926 jetty-webapp-8.1.0.RC5.jar
16/07/2012 14:03 37,919 jetty-xml-8.1.0.RC5.jar
19/06/2012 14:57 414,240 jstl-1.2.jar
19/06/2012 14:53 367,444 log4j-1.2.14.jar
17/07/2012 09:42 6,300 WebJettyServices-0.0.1-SNAPSHOT.jar
16/07/2012 14:03 210,354 servlet-api-3.0.20100224.jar
17 File(s) 2,893,814 bytes
I think the error is probably due to a conflict in the jar files. I have tried the following with no success
- Rebuilt the war file without the jstl dependency
- Rebuilt the Jetty Starter app without the jstl dependency.
- Rebuilt both without the jstl dependencies
I am now stuck as i dont know how else to test. Here are the relevant code snippets. Here is the Maven pom file for the Jetty starter application. One big problem i found is that it is very difficult to really know which dependencies are required to get this to work. search.maven.com seem to not have all the jar files required by the org.eclipse.* dependencies.
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>WebClient</artifactId>
<groupId>com.mypackage</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mypackage</groupId>
<artifactId>WebJettyServices</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>WebJettyServices</name>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jetty.version>8.1.0.RC5</jetty.version>
<log4j.version>1.2.14</log4j.version>
<glassfish.javax.version>2.2.3</glassfish.javax.version>
<glassfish.javax-impl.version>2.2</glassfish.javax-impl.version>
<glassfish.javax-jstl.version>1.2.1</glassfish.javax-jstl.version>
<glassfish.jstl.version>1.2</glassfish.jstl.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--
<dependency>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all-server</artifactId>
<version>8.1.0.RC5</version>
</dependency>
Jetty Webapp -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>${jetty.version}</version>
</dependency>
<!-- JSP Support -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp</artifactId>
<version>${glassfish.javax.version}</version>
</dependency>
<!-- EL Support -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>${glassfish.javax.version}</version>
</dependency>
<!-- JSTL Support -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${glassfish.jstl.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mypackage.jetty.WebStarter</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Edit
Here is the JSP page in question
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="<c:url value="/styles/btmsm.css"/>"
type="text/css" />
<title>Local Timestamp</title>
</head>
<body>
<div id="container" style="width: 800px">
<div id="header" style="background-color: #EEEEBB;">
<h1 style="margin-bottom: 0;">Local timestamp</h1>
</div>
<div id="content"
style="background-color: #EEEEEE; height: 200px; width: 650px; float: left;">
The local time is ${localTime}
</div>
</div>
</body>
</html>
And the web app version shown in the web.xml file
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
The application does work if i deploy the war file directly onto the Tomcat or Jboss deployment folder. It is only a problem when embedded with Jetty.