I'm using
When I run my app in Eclipse and browse to my webpage which contains JSTL tags it works fine. When I bundle it in an executable jar and run from cmd prompt I get
org.apache.jasper.JasperException: /jsp/pcReport.jsp(4,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
My Dependencies
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency>
My Plugins
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>com.pricemon.server.Main</mainClass>
<classpathPrefix>webapp/WEB-INF/lib/</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Class-Path>etc/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
I've got my JSTL jar under WEB-INF/lib which is on my Manifest classpath
I just cant figure out why this works when run under eclipse but wont work when run from executable jar. I've also tried manually adding to classpath when launching with no effect
java -classpath ./jstl-1.2.jar -jar app.jar
Am I missing something obvious!?
I've run into the same problem but found no answer recently. I had to debug glassfish code to solve it. I hope the following explanation can help others.
About dependencies, to run with JSP with glassfish you will need:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.2.3.v20140905</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-jsp-jdt</artifactId>
<version>2.3.3</version>
</dependency>
The reason why your embedded Jetty could not load core even if you have a jar of JSLT 1.2 (propably javax.servlet.jsp.jstl.jar
from glassfish) is because of TldScanner class including in glassfish jars for JSP. To be clear this class has some static like:
197 static {
198 systemUrisJsf.add("http://java.sun.com/jsf/core");
199 systemUrisJsf.add("http://java.sun.com/jsf/html");
200 systemUris.add("http://java.sun.com/jsp/jstl/core");
201 }
And it would not load TLD in the JAR because of the block in
515 private void mapTldLocation(String resourcePath, TldInfo tldInfo,
516 boolean isLocal) {
517
518 String uri = tldInfo.getUri();
519 if (uri == null) {
520 return;
521 }
522
523 if ((isLocal
524 // Local tld files override the tlds in the jar files,
525 // unless it is in a system jar (except when using myfaces)
526 && mappings.get(uri) == null
527 && !systemUris.contains(uri)
528 && (!systemUrisJsf.contains(uri) || useMyFaces)
529 ) ||
530 (!isLocal
531 // Jars are scanned bottom up, so jars in WEB-INF override
532 // thos in the system (except when using myfaces)
533 && (mappings.get(uri) == null
534 || systemUris.contains(uri)
535 || (systemUrisJsf.contains(uri) && !useMyFaces)
536 )
537 )
538 ) {
...
There is no way it's gonna load your TLD if the url is "http://java.sun.com/jsp/jstl/core" and it is stored in a local jar. To make it NOT LOCAL, the application must be loaded by a class loader whose parent contains the JSTL jar. In short, you need to modify code to initialize WebAppContext
as something like:
...
WebAppContext webapp = new WebAppContext();
// classURLs may contains URL to WEB-INF/classes or WEB-INF/lib/additional_jar of you web app
URLClassLoader classLoader = new URLClassLoader(classURLs.toArray(new URL[classURLs.size()]),
Thread.currentThread().getContextClassLoader());
webapp.setClassLoader(classLoader);
...
ContextHandlerCollection contextCollection = new ContextHandlerCollection();
contextCollection.addHandler(webapp);
...
Server server = new Server(threadPool);
server.setHandler(contextCollection);
server.start();
...
If this does not help, I'd like to learn how you embed Jetty in you application.
You have a conflicting / duplicate artifact for JSTL.
Simplify your dependencies.
<dependencies>
<!-- Meta Dependency - adds JSP support to the same version of Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency> -->
</dependency>
You can see that we don't use the JSTL artifact and org.mortbay.jetty provided jsp support level.
Jetty has provided a meta dependency to pull in the artifacts to support JSP on the same version of Jetty as your jetty-webapp artifact.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With